题意:
有N个盒子,每个盒子最多装一个球. 球的颜色不一定相同.
现在要进行m次区间操作:
每次操作 [l, r] 后可以随意将区间内的球重新分配回去.
问经过上述操作后是否有可能达到给定的状态.
思路
贪心.
首先应该明白 待操作数据与目标数据是一一对应的关系,然后接下来就去想,如何可以判断是否可以匹配上。
为每个球记录它在最终结果中的序号. 对于颜色相同的球:左边的尽量分配小的序号.
对于m次区间操作,就将区间[l,r]中的球按最终序号排序.
每次排序都相当于让区间中的球向它们的最终位置更近一步.
最终再比较是否每个球都到位
#include<bits/stdc++.h>
#define LL long long
using namespace std;
///
const int maxn = 100000+10;
int n,t,m,b[maxn];
struct st{
int val,pos;
}q[maxn];
bool cmp(st x,st y){
return x.pos<y.pos;
}
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&q[i].val);
q[i].pos=-1;
}
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(q[j].val==b[i]&&q[j].pos==-1){
q[j].pos=i;
break;
}
}
}
while(m--){
int l,r;
scanf("%d%d",&l,&r);
sort(q+l,q+r+1,cmp);
}
int fg=0;
for(int i=1;i<=n;i++){
if(q[i].val!=b[i]){
fg=1;
break;
}
}
if(!fg)
puts("Yes");
else
puts("No");
}
return 0;
}