Codeforces Round 907 (Div. 2) Editorial

· · 个人记录

对我来说的难度: A<B<F<D<<C<E

A

从前向后贪心就好了.

B

每个数 a_i 最多被操作 \lfloor \log_2 a_i \rfloor 次.

每次操作,a_i 会变成 2^{x_i - 1} 的倍数.

暴力维护就好了.

C

最优方案是技能 1 干掉一半,剩下使用技能 2 解决.
应最小化使用技能 2 的次数.

考虑最少要用多少次,这里可以显然得出一个结论,设将 a 排序从大到小后,第一个前缀和大于等于 \frac{\sum\limits_{i=1}^{n}a_i}{2} 的元素编号为 pos,那么这 pos 个元素都是需要使用技能 2 的.

不难的得出,总答案是 \lceil \frac{\sum\limits_{i=1}^{n}a_i}{2} \rceil + pos.

D

显而易见 f 的变化次数是 log 级别,而在 f 相等的情况下, g 的变化次数是 log 级别.

二分就行.

E

贪心题。

可以先拆分成一些由前后互质的数组成的数列。

由于 1 是一个特殊的存在,直接操作非 1 的数,若旁边有相邻的 1,那么不会改变与 1 的 gcd,所以将所有 1 找出来,记录所有连续 1 的段落,另外如果连续 1 子段的某一端在 1n,则按照贪心策略应放到最后操作。

特别地,如果整个数组全是 1,答案是 n-k

具体的,将所有不包含 1 互质子段扔进队列 1,所有不包含位置 1,n 的连续 1 子段扔进队列 3,另外设一个队列 2,后面解释。

然后,很明显,有以下贪心过程。

Submission

F

为了方便,将询问离线,提前建立最终的树.

对于修改子树,可以提前 dfn 标号,这样整个子树的 dfn 是连续的一段区间,随后使用树状数组.