[CF911D] Inversion Counting

Description

给你一个长度为 (N) 的序列,有 (M) 次操作。每次翻转 ([l,r]) 的区间,每次操作后询问序列逆序对个数的奇偶性。

Solution

翻转一个子区间个数为偶数的区间,逆序对个数奇偶性不变

翻转一个子区间个数为奇数的区间,逆序对个数奇偶性改变

#include <bits/stdc++.h>
using namespace std;

const int N = 1000005;

int ar[N],a[N],n,m,u,v;

int lowbit(int t) {return t&(-t);}

void add(int i,int v) {
    for(;i<N;i+=lowbit(i)) ar[i]+=v;
}

int sum(int i) {
    int s=0;
    for(;i>0;i-=lowbit(i)) s+=ar[i];
    return s;
}

signed main() {
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++) {
        cin>>a[i];
    }
    int ans=0;
    for(int i=1;i<=n;i++) {
        ans+=sum(n)-sum(a[i]);
        add(a[i],1);
    }
    ans&=1;
    cin>>m;
    for(int i=1;i<=m;i++) {
        cin>>u>>v;
        int t=v-u+1;
        t=t*(t-1)/2;
        if(t%2) {
            ans^=1;
        }
        cout<<(ans?"odd":"even")<<endl;
    }
}
原文地址:https://www.cnblogs.com/mollnn/p/12797066.html