Codeforces Round 1089 Div.2 做题记录
Codeforces Round 1089 Div.2
| 编号 | CF2210 |
|---|---|
| 赛时解决 | A,B,C1 |
| 赛后订题 | A,B,C1,C2 |
Solution
A
【+1min】
注意到 \((i+1) \bmod i = 1\),而这里可以取等。
所以 \(a_i = n-i+1\) 即可。
B
【+30min】
卡的时间有点长。
考虑对于 \(p_i \le i\) 的情况,这对后续是没有影响的。而如果是 \(p_i > i\) 且这个被选了,那么 \(p_i\) 及其之后的就选不了了。
考虑到此时用 \(i\) 的不选去换 \(p_i\) 的选是不劣的,因此考虑所有的 \(p_i > i\) 都不被选,\(p_i \le i\) 都被选就是最优的。
答案即为 \(\sum_i [p_i \le i]\)。
另解:
反悔贪心,本质与上面的类似。
赛时写的优先队列 priority_queue,算以 \(i\) 结束时的答案,最后取最大值。
具体实现还是挺容易的,把不合法的从队列中去掉即可。由于进出队最多一次,因此复杂度是对的。
C1
【+20min】
由于修改后所有区间的 \(\gcd\) 都要不变,这等价于相邻两个的 \(\gcd\) 不变。
考虑先算出相邻两个的 \(\gcd\),\(g_i = \gcd(a_i,a_{i+1})\)。
然后设 \(c_i = \gcd(g_{i-1},g_{i})\)(特别地,\(c_1 = g_1,c_n = g_{n-1}\)),这样 \(a_i' = k_i c_i\),其中 \(k_i\) 是一个正整数系数。
这部分的正确性证明,可以考虑用集合解决。
具体方法是定义每个数的质因子可重集,然后从集合角度画 Venn 图分析。
【+5min】
那么为了不干扰 \(\gcd\),把 \(k_i\) 设为 \(1\) 就是一个极好的选择。这样既尽可能满足 \(m \le b_i\) 的限制,又不会干扰 \(\gcd\)。
所以看一下 \(k_i = 1\) 时 \(k_ic_i = a_i\) 是否成立即可,时间复杂度一只 \(\log\)。
C2
好题。
【+20min】
在 C1 的基础上思考,\(k_i\) 到底要取什么值。
如果 \(k_i\) 可以取 \(1\),那么这就皆大欢喜了。不过这里有两种可能的其他情况:
- 若 \(b_i < c_i\),也就是 \(k_i\) 连 \(1\) 都取不到,只能不变,\(k_i = \frac{a_i}{c_i}\)。
- 若 \(a_i = c_i\),此时 \(k_i\) 取 \(1\) 是没有贡献的,考虑让 \(k_i\) 取一个其他的值。
- 这个其他的值 一定是一个质数,因为保留一个质因子总是不劣的。
- 同时,这个质数一定不会很大,不会超过 \(100\)。这是因为 \(2 \sim 100\) 内的质数全部乘到一起已经超过了任意的 \(a_i \times a_j\),也就是在这些质数中,一定存在至少一个质数使得 \(a_i,a_j\) 中都没有这个质因子。此时 \(k_i\) 取这样的质数就能满足 \(\gcd\) 不变的条件。
所以这样跑 DP 即可,时间复杂度两只 \(\log\),常数略大。

浙公网安备 33010602011771号