【cf】交换
交换数组中元素,逆序对数±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");
}
}
}