题意:转化模型后,意思就是,n个数,可以重复,q次修改每次可以将l[i]到r[i]里的数按自己想的方法排序,问能否通过q次操作,将a数组转换成b数组。
思路:首先先可以排除a数组里元素和b数组元素不完全相同的情况。然后用b数组去a中找最近的一个相同的数,表上b的下标
然后每次区间修改就是将a数组按照标号排序一下。之所以可以这样做是因为这个数组最后一定是要变成升序的所以每次修改都把区间都修改成升序肯定没有问题。
#include<bits/stdc++.h>
using namespace std;
int b[1111];
int vis[1111];
int l[1111];
int r[1111];
struct NODE {
int v,num;
}a[1111];
bool cmp(const NODE X,const NODE Y) {
return X.num<Y.num;
}
int main()
{
int t;
int n,q;
scanf("%d",&t);
while(t--) {
memset(vis,0,sizeof vis);
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i].v);
}
for(int i=1;i<=n;i++) {
scanf("%d",&b[i]);
}
for(int i=1;i<=q;i++) {
scanf("%d%d",&l[i],&r[i]);
}
int sa;
for(int i=1;i<=n;i++) {
sa=0;
for(int j=1;j<=n;j++) {
if(!vis[j]&&a[j].v==b[i]) {
sa=1;
a[j].num=i;
vis[j]=1;
break;
}
}
if(sa==0) break;
}
if(sa==0) {
printf("No\n");
continue;
}
for(int i=1;i<=q;i++) {
sort(a+l[i],a+r[i]+1,cmp);
}
int fa=1;
for(int i=1;i<=n;i++) {
if(a[i].num!=i) {
fa=0;
break;
}
}
if(fa==1) {
printf("Yes\n");
}
else {
printf("No\n");
}
}
return 0;
}