题意
给出两个序列,和一堆区间,每次能把A序列区间中的值任意交换,问全部操作完成后,是否能变成B序列。
思路
在A序列中标记每个数再B序列中的位置,每次操作都是要让数,靠近他的最终位置,所以只要对区间中的数按照他在B序列中的位置排序就行了。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3+10;
int A[maxn],B[maxn];
queue <int> Q[maxn];
int main (){
int T;
scanf("%d", &T);
while(T --){
int n,k;
bool flag = true;
scanf("%d %d", &n,&k);
for(int i = 0 ; i < n; i ++) scanf("%d",A + i);
for(int i = 0 ; i < n; i ++){
scanf("%d",B + i);
Q[B[i]].push(i);
}
for(int i = 0 ; i < n; i ++){
int colo = A[i];
if(Q[colo].empty()) flag = false;
else{
A[i] = Q[colo].front();
Q[colo].pop();
}
}
while(k --){
int l,r;
scanf("%d %d", &l,&r);
sort(A+l-1,A+r);
}
for(int i = 0 ; i < n ; i ++){
if(A[i] != i){
flag = false;
break;
}
}
if(flag) puts("Yes");
else puts("No");
for(int i = 0 ; i < 1e3+5 ;i++)
while(!Q[i].empty()) Q[i].pop();
}
}