CF1552G题解报告
一道人类智慧题。
首先我们知道长度为 \(n\) 的序列有无穷多个,但是我们只关心排序后的序列,即两数之间的大小关系,所以我们可以枚举 \(1 \sim n\) 的全排列,判断是否合法即可。但是复杂度为 \(O(n! \times k)\)。会见祖宗。
我们猜测:
无论 \(a\) 是什么都能正确排序,等价于无论 \(a\) 是什么 \(01\) 序列都能正确排序。
证明:
考虑对于一个整数 \(x\),将所有 \(a\) 中 \(> x\) 的元素设为 \(1\),其他设为 \(0\),则如果可以对 \(01\) 序列正确排序,则一定可以区分 \(\le x\) 和 \(> x\),因为对于所有 \(x\) 都成立,所以总是可以正确排序。
必要性显然。
那么我们就把时间复杂度降成了 \(O(2^n \times k)\)(直接枚举 \(01\) 序列即可),但是也会见祖宗。
我们发现,一个 \(01\) 序列排完序后会变成 \(0 \ldots 0 1 \ldots 1\)。又因为我们只关心排序后的序列,所以我们只需要枚举新确定的数中有多少个 \(0\),放前面,后面的放 \(1\) 即可。我们设第 \(i\) 次操作会确定 \(a_i\) 个,必然有 \(\sum a_i \le n\),复杂度为 \(O(\Pi (a_i + 1)) \le O(k \times (\frac{k}{n} + 1)^k)\),可以通过。
实现技巧:这道题同机房的 dalao 说有点卡常,所以可以把 \(01\) 序列压缩到一个 \(32\) 位整形里。代码比较好写,就不贴了。