CF做题记录

听 winty 说多刷 CF1700~1900 很有好处,我决定来板刷点题。
后面也可能有些难度不在1700~1900的。

CF1329A

我们有两个基本观察,如下:

  1. \(\sum_{i=1}^ml_i \geq n\),否则填不满所有格子。
  2. \(i + l_i - 1 \leq n\),这个是因为如果 \(i + l_i - 1 > n\),那么一个空序列在放入一个长度为 \(l_i\) 的区间之后,剩下的空格子不足 \(i - 1\),也就是不可能放下前面的 \(i - 1\) 种颜色。

在这两种情况都输出 -1 之后,我们可以构造地说明是一定有解的。
一些观察:上面的第一种情况其实对应着区间不相交的方案,而下面则对应 \(p_i = i\) 的方案,感性理解这两种是恰好相反的,只要结合起来就能构造出答案。
具体如下,我们先令 \(suf\) 表示 \(l\) 的后缀和,令 \(p_i = n - suf_i + 1\),也就是说从 n 倒着放,并且区间之间没有相交。
显然,这种方法存在问题,但是我们可以调整,具体的,找到第一个 \(i\) 使得 \(p_i \geq i\),对于 \(j < i\), 令 \(p_j = j\),剩下的不变,则满足条件。
证明分两方面,第一方面,我们证明每种颜色都是出现过的,这比较显然,因为对于颜色 \(j < i\),它必然在 \(j\) 这个位置上出现过,而后面的则由于区间两两不交,每个颜色显然出现过至少一次。
第二方面,我们证明每个格子都有颜色,由于在 \(i + 1\) 以及之后的部分是恰好把格子占满了,我们只需要证明在 \(p_i\) 和之前没有 “空白” 即可。
形式化地,就是要证明下式。

\[\begin{align}\label{eq1} \max_{1 \leq j \leq i - 1} (j + l_j - 1) \geq n - suf_i + 1 \end{align} \]

左边就是说在满足 \(j \in [1, i - 1]\),都有 \(p_j = j\) 的情况下最右边的点,而右边就是 \(p_i\)
当然,我们有一些条件,例如 \(n - suf_i + 1 \geq i\)
但是这并不是重点,重点是说,对于任意的 \(j \in [1, i - 1]\),有 \(n - suf_j + 1 < j\)
这是因为 \(i\) 是找到的第一个满足 \(n - suf_i + 1 \geq i\) 的位置,则它之前的自然不满足这个约束。
一个直接的想法是说我们直接考察位置 \(i - 1\)
那么带入到 \((1)\) 式中,就是要证明

\[i - 2 + l_{i - 1} \geq n - suf_i + 1 \begin{align}\label{eq2} i - 3 \geq n - suf_{i - 1} \end{align} \]

根据条件,我们有 \(n - suf_{i - 1} + 1 < i - 1\),即 \(n - suf_{i - 1} < i - 2\),则 \((2)\) 式显然成立,证毕。
这题其实不难,但是构造和证明还是比较巧妙的,再加上网上现有的题解都是些相对麻烦的做法,特此写篇题解,注意 \(suf\) 的最大值可以达到 \(10^{10}\),要开 long long
code

CF1329 B

定义 \(h(x)\) 表示 \(x\) 二进制下最高的一的位置,充要条件其实就是 \(h(a_i) < h(a_{i + 1})\)
充分性是显然的,必要性也不难说明,考虑第一个位置使得 \(h(a_i) = h(a_{i + 1})\),则在这之前的 \(h\) 都是递增的,那我们归纳不难说明 \(h(a_i) = h(b_i) = h(a_{i + 1})\),而 \(b_{i + 1} = b_i \oplus a_{i + 1}\),那么 \(b_i\)\(a_{i + 1}\) 的最高位抵消掉了,\(b_{i + 1}\) 显然会小于 \(b_i\),矛盾。
然后就简单了,我们只要枚举二进制下每位 \(i\),序列中最多一个位置 \(j\) 使得 \(h(a_j) = i\),把这个位置可能的数字统计一下,并加一(表示不存在这样的 \(j\))乘起来即可,最后要把空序列减掉。
code

CF1329C

不难发现,在最终的树中,叶子肯定是在原树的子树中最小的那个。
而其他节点是原树的子树中大于两个叶子的最小的点,类似归并排序的做即可。
code

CF1328E

这个题很搞笑啊,题目简单,代码好写,感觉难度远小于上面三个题。
一眼就是所有的 \(fa\) 必须在一条链上,下面来证一波。
定义关键点表示每次询问中给出的点,\(cnt_u\) 表示以 \(u\) 为根的子树中关键点的数量(不包含 \(u\))。
结论:
合法的充分必要条件是每层最多一个 \(cnt\)\(0\) 的点,充分性显然,必要性证明如下:
考虑这条路径在 \(d - 1\) 层经过的点是 \(fa\),而在 \(d\) 层有两个点 \(a, b\) 满足 \(cnt > 0\) ,不妨设这条路径往 \(a\) 走,由于 \(b\) 的子树中有至少一个非 \(b\) 关键点 \(c\),由于 \(c\) 到路径上要先去 \(b\),而 \(b\) 不在这个路径上,则这个点到路径的距离一定大于 \(1\),矛盾。
现在我们考虑怎么判这件事,显然我们可以考虑一个点 \(u\)\(cnt\) 的影响,不难发现就是把 \(fa_u \rightarrow 1\) 的路径上的 \(cnt\)\(1\),而每层又只有一个点 \(cnt\)\(0\),则要求就是所有的 \(fa_u\) 都在一条链上(这个链其中一端是根),而这条链的另一个端点必然是 \(fa_u\) 中深度最深的点,称其为 \(t\),只要判剩下的点是不是 \(t\) 的祖先即可,我写了个倍增。
code

CF1316C

考虑系数在\(\bmod p\) 之后的最低非 \(0\) 位分别是 \(a_i,b_j\),那么 \(c_{i+j}=a_ib_j\) 必定不为 \(0\),故答案为 \(i+j\)

CF1827A

考虑 \(b_i\) 的贡献,设 \(a\) 中比它大的个数 \(x\)\(b\) 中比它大的个数 \(y\),那么贡献应该是 \(x-y\),对所有 \(b\) 乘一起即可。

CF1326D2

答案必定形如 \(ABA^{rev}\),其中 \(A^{rev}\)\(A\) 的逆序串,并且 \(A\)\(A^{rev}\) 分别为 \(S\) 的前缀和后缀。
而选择尽量长的 \(A\) 必然是不亏的,故直接找最长的 \(A\),然后在 \(S\) 中把 \(A\)\(A^{rev}\) 删掉。
现在问题转化成找 \(B\),也就是求最长的回文前缀(后缀),哈希一下就行。
单模数过不去,必须要双模数(血的教训。。。)

CF1324F

令白点权值为 \(1\),黑点权值为 \(-1\),即求最大权值和,换根 dp 即可。

posted @ 2022-08-22 17:39  71rats  阅读(69)  评论(0编辑  收藏  举报