交换数组中元素,逆序对数±1,所以逆序对奇偶性发生改变
D. Swap Dilemma
https://www.cnblogs.com/pure4knowledge/p/18292578这个写的太好了
任意交换两个数,会使序列的逆序对数加减一个奇数。
所以如果两个序列,初始逆序对数的奇偶性不同,肯定无法兑换成功
那么,如果两个序列,初始逆序对数的奇偶性相同,是否一定能对换成功?
答案是一定可以的,我们做相邻对换,由于相邻对换总是可以操控逆序对数是加一还是减一,所以两个序列一定能对换到逆序对数相同的状态
#include<iostream>
using namespace std;
#include<cstring>
#include<algorithm>
const int N=200010;
const int MAXN=200000;
int tr[N];
int n;int a[N];int b[N];int lowbit(int x){return x&(-x);}
void add(int x,int c){
for(int i=x;i<=MAXN;i+=lowbit(i)){tr[i]+=c;
}
}
int sum(int x){int res=0;
for(int i=x;i>0;i-=lowbit(i)){res+=tr[i];
}
return res;
}int get(int a[]){memset(tr,0,sizeof(tr));int ans=0;
for(int i=1;i<=n;i++){ans+=sum(a[i]-1);add(a[i],1);
}
return ans;
}int main(){
int T;cin>>T;
while(T--){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)scanf("%d",&b[i]);int na=get(a);int nb=get(b);sort(a+1,a+n+1);sort(b+1,b+n+1);bool flag=1;for(int i=1;i<=n;i++){if(a[i]!=b[i]){flag=0;break;}}if(!flag){printf("NO\n");continue;}if((na&1)==(nb&1)){printf("YES\n");}else {printf("NO\n");}
}}