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\) 就行了。