Codeforces 1314 题解

这场整体质量感觉可以算 2020 年度(目前为止)最垃圾。

A

按数值从小到大扫描,维护一个优先队列,每遇到一个数加入队列,每次数值发生 \(+1\) 时弹掉队列中价值最大元素,然后把此时队列中所有元素的价值和类加进答案。
时间复杂度 \(O(n\log n)\).
代码: 78541690

B

这题看起来最难以处理的就是编号问题,所以就从编号问题入手,可以发现当场上还剩下 \(2^i\) 个人时,将所有人按编号从小到大划分为 \(2^{i-1}\) 个大小相等的组,则每组中恰有一人在 Upper Bracket,恰有一人在 Lower Bracket. 每场比赛会合并相邻的两个组。
于是就可以 DP 了:设 \(f[i][u][x][y]\ (x,y\in \{0,1\})\) 表示第 \(i\)\(u\) 这一组,Upper 和 Lower 的人分别是否被关注即可。
时间复杂度 \(O(2^n)\).
代码: 79378015

C

把所有子串拎出来排序,二分答案。每次就是要求将 \(s\) 划分为 \(m\) 个连续子串,且每个子串字典序都不小于 \([L,R]\) 的方案数。(串一模一样的时候没有必要再区分大小)
直接 DP 是 \(O(n^3)\) 的,但是注意到一个点能转移到的是一段区间,于是就可以 \(O(1)\) 转移。
时间复杂度 \(O(n^2\log n)\).
代码: 79516172

D

无奇环等价于任何一个点都不能同时出现在奇数和偶数的位置上。设 \(1\) 号点的位置是 \(0\),可以爆搜偶数位置上的值,然后就是要对 \((i,j)\)\(\min_k(dis_{i,k}+dis_{k,j})\),其中 \(k\) 有不超过 \(\frac{m}{2}\) 个位置是被 ban 的。于是对每个 \((i,j)\) 预处理一下前 \(4\) 大就可以完成。
时间复杂度 \(O(n^{\frac{m}{2}-1}m^2)\),常数很小。
代码: 78551177
题解还给了一种随机做法:大概每次把所有的点以某种随机方式染成二分图,随机 \(512\cdot 20\) 次,最优解在至少一次的随机中出现在二分图两侧的概率约为 \(1-2\times 10^{-9}\).

E

不难发现 \(|f^2(A)|\le \sqrt{2|A|}\).
考虑如何判断一个终止状态是否合法,只需要求出初始状态最少有多少个元素即可,那么肯定是每次贪心地展开,设 \(f^k(A)\) 从大到小排序后为 \(b_1,...,b_l\),则 \(f^{k-1}(A)\) 中有 \(b_i\)\(i\). 把按这种方式贪心展开的函数叫做 \(g(A)\). 很容易推知 \(|g(A)|=\sum^l_{i=1} a_i,|g^2(A)|=\sum^l_{i=1}ia_i\).
那么对于 \(K=1\)\(K=2\) 的情况,可以直接 DP 解决,使用 DP 划分数的经典方法,有一个序列初始为 \(\{1\}\),每次给最后面添加一个 \(1\) 或者给所有数都 \(+1\). 时间复杂度 \(O(n^2)\).
对于 \(K\ge 3\) 的情况,必定有 \(|f^k(A)|\le \sqrt{2n}\le 63\). 于是可以爆搜划分数,然后贪心展开。一个很有用的剪枝是,如果任何时候展开的大小超过 \(n\) 就没有必要继续搜下去了,加上这个之后运行时间从 \(1918\ \text{ms}\) 变成了 \(78\ \text{ms}\)

\[\sum^{63}_{i=1}P(i)\approx 10^7,\ P(64)\approx 2\times 10^6 \]

时间复杂度 \(O(n^2+P(\sqrt {2n})\text{poly}(n))\),其中 \(\text{poly}(n)\) 部分很小。
代码: 79614806

F

nim 积意义下的离散对数。下面默认求 nim 的复杂度是 \(O(\log^2 W)\).
考虑整个域的大小是 \(W=2^{64}-1\),首先显然有一个 \(O(\sqrt W\log^2 W)\) 的 BSGS 做法。
显然 \(W\) 不是质数,分解一下发现 \(W=3\times 5\times 17\times 257\times 641\times 65537\times 6700417\),每一个质因子都不大,可以考虑计算答案在模每个质因子意义下的值,最后 CRT 合并。
设当前处理的质因子是 \(P\). \(a^{\bigodot kP+r}=b\ \Leftrightarrow\ a^{\bigodot kW+\frac{W}{P}\cdot r}=b^{\bigodot \frac{W}{P}}\ \Leftrightarrow\ (a^{\bigodot \frac{W}{P}})^{\bigodot r}=b^{\bigodot \frac{W}{P}}\),所以就是要解 \((a^{\bigodot \frac{W}{P}})^{\bigodot r}=b^{\bigodot \frac{W}{P}}\). 直接 BSGS 即可。
时间复杂度 \(O(\sum \sqrt{P_i}\log^2 W)\).
代码: 79635282

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值