Codeforces Round #815 (Div. 2)

C

注意到在第一次取掉一个L后,剩下的L都可以做到只消耗一个 1。

因为如果第一次取掉的L耗费不为 1,则消除后周围一定仍有 1,且这个 1 与消掉的 L 紧密相连。

所以我们只需要判断最小的取第一个L的花费。这个很容易做到。

D1

由于值域的限制,dp 转移只需要考虑前面 \(256\) 个位置就行了。

D2

由于 \(a_i\oplus j\)\(a_j\oplus i\) 在第 \(k\) 位分出大小等价于 \(a_i\oplus i\)\(a_j\oplus j\) 在第 \(k\) 位分出大小,所以把所有的 \(a_i\oplus i\) 插入到 01-trie 里面。

对于 01-trie 每个节点维护一下 \(a_i,i\)\(k\) 位分别为 0,1 的四种情况最大值即可。这里的 \(k\) 为当前节点连向儿子的边上的值的位数。

E

首先如果需要把颜色数改多就很智障,直接排除这种情况。

容易猜到答案不超过 \(2\),证明:

取一个最大的左上角为 \((1,1)\) 的正方形 \(L\) 使得把它重新染色后颜色数 \(\ge k\)。如果已经只有 \(k\) 种颜色了那就不管。否则再选一个以 \((L+1,L+1)\) 为右下角的正方形,不断扩大它,直到满足要求为止。

然后判断答案是否为 \(1\) 就行了。

posted @ 2022-08-21 12:01  zqs2020  阅读(23)  评论(0编辑  收藏  举报