评价
一道逆序对的题目,挺不错的。但数据问题好大啊!!!我一开始以为操作不是独立的,然后由于题面的数据范围有误导致我过了很久才AK,但是比赛结束了我开始写题解的时候看到赛事答疑帖里有人问操作是不是独立的然后回答竟然为是……
题意
简单来说就是有nnn个数,要希望能进行恰好k次操作使得它们按照从小到大的顺序排好序,但是会进行m次修改,每次修改是独立的,一次修改会将所有数字变成它的w次方,问一开始以及每次修改后是否有可能进行恰好k次操作使它们从小到大排序。
解析
众所周知,通过交换一个数组中的相邻数字来将这些数字从小到大(或从大到小)排序所需的交换次数是这组数字中的逆序对数,而题目中的操作并不会改变这些数字的大小关系,所以只需要统计逆序对数量……
打住,通过观察样例我们发现负数是一个肥肠大的变数,众所周知一个负数的偶数次方的结果为一个正数,但奇数次方却还是负数,所以我们这里不仅需要统计逆序对的数量,还要统计负数变成其绝对值时逆序对的数量。
从小到大排序所需的交换次数的问题解决了,但注意题目里要求的是恰好k次操作,怎么办呢?首先很显而易见的是,如果所需的交换次数比k还大那不用想了,肯定不行。还有,两个数字交换一次然后再交换一次还是原来的顺序,所以如果k减去交换次数是偶数也可以。最后,两个相同的数字交换后还是原来的顺序,所以如果有两个相同的数字也可以的。
问题解决了,不过还有三个小细节要注意:
1. 数据范围比较大要离散化(因为我用的是树状数组求逆序对,归并排序应该不需要离散化)
2. 统计逆序对的变量要开long long
3. 需要判断特殊情况n = 1,因为这种情况下无法交换数字,只有k = 0时才能输出YesYesYes(不过鉴于这个数据很水我严重怀疑数据里面可能根本就没有n = 1
代码