做法

任意交换两个数后,逆序对数的奇偶性改变

先求出原始序列的逆序对数的奇偶性(可以通过归并排序或者树状数组的方法求逆序对数)

对于操作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;
}