Note:这个题无关Sort的稳定性问题,只是突然想起,不稳定排序的sor如何写cmp函数才变成稳定性排序,就是把return a1.value<=a2.value 写为return a1.value<a2.value即可,则相等不交换位置。
0
题目很清楚
1
每个数的归宿都是唯一的,第一个数组要变成第二个数组的样子,如果可以,那么每个数都对应唯一的正确位置,而位置就是1到n,所以每次输入一个调整的区间,就将该区间内的数sort。
2
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn=1010;
struct Nums{
int value;
int pos;
bool operator <(struct Nums nn)const{
return pos<nn.pos;
}
}num[maxn];
int b[maxn];
/*
bool cmp(struct Nums a1,struct Nums a2){
return a1.value<a2.value;
}
*/
int main()
{
//int a[]={5,4,3,2,1,0};sort(a+1,a+1+4,cmp);//a[]={5,1,2,3,4,0};两个参数分别是首地址和尾地址,其中尾地址是排序的最后一个数的下一个数的地址,有点左闭右开区间的意思。
//for(int i=0;i<=5;i++){cout<<a[i]<<" ";}cout<<endl;
/* 如果cmp函数里是<则稳定排序,如果<=则不稳定排序
struct Nums test[maxn];
for(int i=0;i<=5;i++){
scanf("%d",&test[i].value);
test[i].pos=i;
}
sort(test+1,test+1+4,cmp);
for(int i=0;i<=5;i++){
cout<<test[i].pos<<endl;
}
*/
int kase;
cin>>kase;
int n,m;
while(kase--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&num[i].value);
num[i].pos=-1;
}
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
for(int j=1;j<=n;j++){
if(num[j].value==b[i]&&num[j].pos==-1){
num[j].pos=i;
break;//一一对应,break
}
}
}
int l,r;
for(int i=1;i<=m;i++){
scanf("%d%d",&l,&r);
if(l>r) swap(l,r);
sort(num+l,num+1+r);//a[]={5,4,3,2,1,0},sort(a+1,a+1+4);a[]={5,1,2,3,4,0};
}
int flag=1;
for(int i=1;i<=n;i++){
if(num[i].value!=b[i]){
flag=0;
break;
}
}
if(flag){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
}