题意:n个数排列,m个询问,每个询问反转一段区间,然后输出整个数组的逆序数的奇偶性。
思路:如果反转的区间有奇数个二元组数对,那么逆序数的奇偶性就改变。因为1=1+0=0+1。然后暴力or树状数组计算原数组的逆序数。
# include <bits/stdc++.h>
using namespace std;
int n, m, l, r, s=0, a[1503], b[1503];
int query(int x)
{
int res=0;
for(int i=x; i; i-=i&-i) res += b[i];
return res;
}
void update(int x) {for(int i=x; i<=n; i+=i&-i) ++b[i]; }
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; ++i) scanf("%d",&a[i]);
for(int i=n; i>=1; --i)
{
s = (s+query(a[i]-1))&1;
update(a[i]);
}
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&l,&r);
if(((r-l+1)*(r-l)/2)&1) s^=1,printf(s?"odd":"even");
else printf(s?"odd":"even");
puts("");
}
return 0;
}