牛客練習賽33 D tokitsukaze and Inverse Number
阿新 • • 發佈:2018-12-15
考慮樹狀陣列或者歸併排序求逆序數
明確一個結論:1到n的排列,任意交換兩個數,逆序數奇偶性發生改變
ans=(操作前的序列逆序數+需要多少次交換才能變為操作後的序列)%2
#include<stdio.h> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<string.h> #include<queue> #include<stack> #include<list> #include<map> #include<set> #include<vector> using namespace std; typedef long long int ll; typedef unsigned long long ull; const int maxn =1e6+5; const int maxm=10000; const int mod =1e9+7; const int INF=0x3f3f3f3f; const double eps=1e-8; int a[maxn],c[maxn]; int n; int lowbit(int x) { return x&(-x); } void add(int x) { while(x<=n) { c[x]++; x+=lowbit(x); } } int sum(int x) { int res=0; while(x>0) { res+=c[x]; x-=lowbit(x); } return res; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int ans=0; for(int i=1;i<=n;i++) { add(a[i]); ans+=i-sum(a[i]); ans=ans&1; } int q;scanf("%d",&q); while(q--) { int l,r,k;scanf("%d%d%d",&l,&r,&k); k=k%2; int len=(r-l)%2*k; if(len&1)ans+=1; ans=ans&1; printf("%d\n",ans); } return 0; }