Codeforces1187 D. Subarray Sorting(思维,线段树)
Posted live4m
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces1187 D. Subarray Sorting(思维,线段树)相关的知识,希望对你有一定的参考价值。
题意:
解法:
首先判断a[]和b[]的元素是否相同,不相同则一定无解.
考虑按b[1],b[2],b[3]的顺序依次恢复数组,
对于b[1],找到a[]中b[1]出现的最左位置pos,
如果min{a[1,pos]}=b[1],那么可以将a[pos]移动过来,然后我们将a[pos]删掉.
依次判断过去即可,区间min操作和删除操作用线段树维护即可.
算法总复杂度O(n*log).
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=3e5+5;
queue<int>pos[maxm];
int a[maxm];
int b[maxm];
int n;
struct Tree{
int mi[maxm<<2];
inline void pp(int node){
mi[node]=min(mi[node*2],mi[node*2+1]);
}
void update(int x,int val,int l,int r,int node){
if(l==r){
mi[node]=val;return ;
}
int mid=(l+r)/2;
if(x<=mid)update(x,val,l,mid,node*2);
else update(x,val,mid+1,r,node*2+1);
pp(node);
}
int ask(int st,int ed,int l,int r,int node){
if(st<=l&&ed>=r)return mi[node];
int mid=(l+r)/2;
int ans=1e9;
if(st<=mid)ans=min(ans,ask(st,ed,l,mid,node*2));
if(ed>mid)ans=min(ans,ask(st,ed,mid+1,r,node*2+1));
return ans;
}
void build(int l,int r,int node){
if(l==r){
mi[node]=a[l];
return ;
}
int mid=(l+r)/2;
build(l,mid,node*2);
build(mid+1,r,node*2+1);
pp(node);
}
}T;
void solve(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
//判断元素是否相同
map<int,int>mp;
for(int i=1;i<=n;i++){
mp[a[i]]++;mp[b[i]]--;
}
for(auto i:mp){
if(i.second!=0){
cout<<"NO"<<endl;
return ;
}
}
//切记初始化
for(int i=1;i<=n;i++){
while(pos[a[i]].size())pos[a[i]].pop();
}
//
for(int i=1;i<=n;i++){
pos[a[i]].push(i);
}
T.build(1,n,1);
for(int i=1;i<=n;i++){
int id=pos[b[i]].front();pos[b[i]].pop();
int mi=T.ask(1,id,1,n,1);
if(mi!=b[i]){
cout<<"NO"<<endl;
return ;
}
T.update(id,1e9,1,n,1);
}
cout<<"YES"<<endl;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
int T;cin>>T;while(T--)
solve();
return 0;
}
以上是关于Codeforces1187 D. Subarray Sorting(思维,线段树)的主要内容,如果未能解决你的问题,请参考以下文章
codeforces 1187 B Letters Shop
CodeForces 1187E Tree Painting
codeforces 1187F. Expected Square Beauty
Codeforces1187 B. Letters Shop(预处理)