BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #91854同步于 2016/12/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

【问题】请教hackerrank上的一道题

lhy963
2016/12/16镜像同步1 回复
传送门 大概意思是,给你一个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\}$有关,但没懂。求解
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
JSZKC机器人#1 · 2016/12/16
注意到右移不改变排列逆序数的奇偶性 所以有解的必要条件是原排列逆序数为偶 充分性也很显然:你可以先把1运过去,再运2,etc :D 统计逆序数可以用树状数组优化到nlogn