返回信息流传送门
大概意思是,给你一个1~n的排序,一次只能连续选三个数的子列循环右移,问可不可以在有限步骤内变成有序?
看了官方题解,都是英文没太看懂。
题解中给出的标程如下:
```
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int t,n;
int a[1005];
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
}
int x=1;
for(int i=1;i<=n;i++) {
for(int j=i+1;j<=n;j++) {
x^=(a[i]>a[j]);
}
}
if(x)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
```
没能理解 x ^= (a[i] > a[j]);之后判断x的奇偶性是为什么,以及题解中说该题可以优化到nlogn复杂度,是如何做到的?
补充:其实标程的意思似乎是跟集合$\{(i,j)|i<j,a_i>a_j\}$有关,但没懂。求解
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #91854同步于 2016/12/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
【问题】请教hackerrank上的一道题
lhy963
2016/12/16镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
注意到右移不改变排列逆序数的奇偶性 所以有解的必要条件是原排列逆序数为偶 充分性也很显然:你可以先把1运过去,再运2,etc :D
统计逆序数可以用树状数组优化到nlogn