题干:
Problem - D - Codeforces
解题报告:
不难发现,假设n的倒序排列(n,n-1,...,3,2,1)的逆序对是x,则对n的任意一个逆序对数为y的排列做翻转,新生成的排列的逆序对数位x-y。
因此这题作为奇偶性,其实只需要关注该翻转区间的【倒序排列的逆序对】就可以了,关于【倒序排列的逆序对】,可以直接用求和公式去算,也可以找到规律,随着翻转区间的长度的增长,奇偶性分别为【奇奇偶偶奇奇偶偶奇奇偶偶】以此类推,所以其实只需要看【区间长度/2】的奇偶就可以了。
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;int a[10005], n, m;
int main() {cin>>n;for(int i = 1; i<=n; i++) {cin>>a[i];}int cnt = 0;for(int i = 1; i<=n; i++) {for(int j = i+1; j<=n;j++) {if(a[i] > a[j]) cnt ++;}}cnt %= 2;cin>>m;for(int l,r,i = 1; i<=m; i++) {cin>>l>>r;
// int x = (r-l) * (r-l+1) / 2; 这样也可以int x = ((r-l+1)/2)%2;cnt = (cnt + x%2) % 2;if(cnt%2 == 1) cout << "odd" << endl;else cout << "even" << endl;}return 0;
}