做法
任意交换两个数后,逆序对数的奇偶性改变
先求出原始序列的逆序对数的奇偶性(可以通过归并排序或者树状数组的方法求逆序对数)
对于操作1==>交换1次(l与r不相等)
对于操作2==>对半交换
对于操作3==>依次向左(或向右)逐位交换
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=200010;
int a[N],b[N];
long long res=0;
void merge_sort(int a[],int l,int r){
if(l>=r) return;
int mid=l+r>>1;
merge_sort(a,l,mid), merge_sort(a,mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r){
if(a[i]<=a[j]) b[k++]=a[i++];
else{
res+=mid-i+1;
b[k++]=a[j++];
}
}
while(i<=mid) b[k++]=a[i++];
while(j<=r) b[k++]=a[j++];
for(i=l,j=0;i<=r;i++,j++) a[i]=b[j];
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
merge_sort(a,1,n);
res&=1;
while(m--){
int op;cin>>op;
if(op==1){
int l,r;cin>>l>>r;
if(l!=r) res^=1;
}
else if(op==2){
int l,r;cin>>l>>r;
int len=r-l+1;
if((len>>1)&1) res^=1;
}
else{
int l,r,k;cin>>l>>r>>k;
int len=r-l+1;
if((k*(len-1))&1) res^=1;
}
cout<<res<<"\n";
}
return 0;
}
京公网安备 11010502036488号