欢迎光临散文网 会员登陆 & 注册

[Codeforces is All You Need]CR 827 G (1742G) - Solution

2022-10-14 15:43 作者:故寓诸无竟  | 我要投稿

让我感觉有点意思的总想写一个题解。

问题简述

        给定一个序列a,请将其重新排列,使得前缀按位或得到的序列b字典序最大,其中b_i%20%3D%20%7C_%7Bj%3D1%7D%5E%7Bi%7D%20a_j

        题目链接:https://codeforces.com/contest/1742/problem/G

思路

        由于最后得到的序列长度恒定为n,因此字典序最小只需令b靠前的项尽可能大,换言之,可以直接构造解%5Cpi

%5Cpi_i%20%3D%20%5Carg%20%5Cmax_%7B%5Bn%5D%20%5Cbackslash%20%5Cpi%5B%3Ai-1%5D%7D%20%5Cleft(%20a_%7B%5Cpi_i%7D%20%7C%20b%5E%7B%5Cpi%7D_%7Bi-1%7D%20%5Cright)

        (注:因为任意解均可,当有多个结果相同时,取最小下标。)我们可以直接如此构造,得到一个复杂度为O(n%5E2)的算法。但实际上没有必要:一个int型(哪怕不带符号)数至多32位,因此一种朴素的感觉是,b序列会很快(32项之内)变成常列,于是此后a的排序将不再影响b的字典序大小。这一朴素的感觉很容易得到证明。

        假设对某一个i,有b_i%5E%7B%5Cpi%7D%20%3D%20b_%7Bi-1%7D%5E%7B%5Cpi%7D,这意味着对任意j%20%5Cin%20%5Bn%5D%5Cbackslash%20%5C%7B%5Cpi%5B%3Ai-1%5D%5C%7D,有:

b_%7Bi-1%7D%5E%7B%5Cpi%7D%20%3D%20a_%7B%5Cpi_i%7D%20%7C%20b_%7Bi-1%7D%5E%5Cpi%20%5Cge%20a_%7Bj%7D%20%7C%20b_%7Bi-1%7D%5E%7B%5Cpi%7D%20%5Cge%20b_%7Bi-1%7D%5E%7B%5Cpi%7D

        如果我们将整数看作集合,上式意味着对任意j%20%5Cin%20%5Bn%5D%5Cbackslash%20%5C%7B%5Cpi%5B%3Ai-1%5D%5C%7D,有a_j%20%5Csubseteq%20b_%7Bi-1%7D%5E%7B%5Cpi%7D。而注意到b的通项按集合为b_i%20%3D%20%5Ccup_%7Bj%3D1%7D%5Ei%20a_j,因此有:

a_j%20%5Csubseteq%20b_%7Bi-1%7D%5E%7B%5Cpi%7D%20%5Csubseteq%20b_%7Bi%7D%5E%7B%5Cpi%7D%20%5Csubseteq%20b_%7Bi%2B1%7D%5E%7B%5Cpi%7D%20%5Csubseteq%20...

        根据上式不难发现,序列将变为常列,即b_%7Bi-1%7D%5E%7B%5Cpi%7D%20%3D%20b_%7Bi%7D%5E%7B%5Cpi%7D%20%20%3D%20...。而如果b_i%5E%7B%5Cpi%7D%20%5Cne%20b_%7Bi-1%7D%5E%7B%5Cpi%7D,则至少集合中多出1个元素,而全集仅包含32个元素,因此实际上只需要计算%5Cpi的前32项即可,时间复杂度为O(32n)

后记

        本场的实况录制地址:https://www.bilibili.com/video/BV1f84y1B7td

        当然,我也不知道为什么我临场写了个那么复杂的玩意儿……看来还需要继续努力。



[Codeforces is All You Need]CR 827 G (1742G) - Solution的评论 (共 条)

分享到微博请遵守国家法律