题目:这里
题意:T组数据,两个长度都为n的数组,有m次操作,操作是对a数组而言,每次操作给一个区间范围l,r,可以将这个区间内的数任意交换顺序,问经过m次操作后,
是否可以将a数组变为b数组。
输入a数组的时候不仅记录数本身,还要记录其在b数组中的位置,然后每次操作的时候将这个区间内的数按其记录的位置的从小到大的顺序排列,如果m次后能够
得到b,就行了,不能就No.
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 const int M = 1e3 + 10; 8 struct point{ 9 int x,y; 10 }a[M]; 11 int b[M]; 12 13 bool cmp(point a,point b) 14 { 15 return a.y<b.y; 16 } 17 18 int main() 19 { 20 int t,n,m; 21 scanf("%d",&t); 22 while (t--){ 23 scanf("%d%d",&n,&m); 24 for (int i=1 ; i<=n ; i++){ 25 scanf("%d",&a[i].x); 26 a[i].y=-1; 27 } 28 for (int i=1 ; i<=n ; i++){ 29 scanf("%d",&b[i]); 30 for (int j=1 ; j<=n ; j++){ 31 if (b[i]==a[j].x&&a[j].y==-1){ 32 a[j].y=i; 33 break; 34 } 35 } 36 } 37 while (m--){ 38 int l,r; 39 scanf("%d%d",&l,&r); 40 sort(a+l,a+r+1,cmp); 41 } 42 bool flag=false; 43 for (int i=1 ; i<=n ; i++) 44 if (b[i]!=a[i].x){flag=true;break;} 45 if (flag) puts("No"); 46 else puts("Yes"); 47 } 48 return 0; 49 }