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;
    }
}

相关文章:

  • 2021-10-13
  • 2021-08-20
  • 2021-09-09
  • 2022-02-25
  • 2022-12-23
  • 2022-12-23
  • 2022-01-18
  • 2021-10-23
猜你喜欢
  • 2021-10-06
  • 2021-06-03
  • 2022-12-23
  • 2022-01-12
  • 2022-02-25
  • 2022-12-23
  • 2021-09-25
相关资源
相似解决方案