$Div.1$
CF1149A Prefix Sum Primes
- 构造 + 贪心.
- 可以先线性筛预处理一个质数表.于是就变成了用一定数量的 $1,2$ 来填每个位置差分的值.
- 从前往后填,如果当前能放 $2$ 的话肯定不会劣于放两个 $1$ .于是能放 $2$ 就放,否则放 $1$ ,直到放完为止.
1 |
|
CF1149B Three Religions
- 贪心 + $dp$ .
- 首先可以发现如果三个串匹配到了一定位置,最后在原串中用的字符位置肯定越靠前越好.
- 于是可以设 $f(i,j,k)$ 表示三个串分别匹配了 $i,j,k$ 的长度时,最后用的字符在原串中的位置.
- 可以预处理 $nx(i,j)$ 表示原串中第 $i$ 个字符往后跳,跳到的第一个字符为 $j$ 的位置.跳不到设为 $n+1$ .那么就可以借助 $nx$ 来完成 $f$ 的转移.
- 那么计算完成后,只需要判断 $f(len_1,len_2,len_3)\leq n$ 是否成立.成立则为 $YES$ ,否则为 $NO$ .
- 并不能 $O(q\cdot 250^3)$ 暴力 $dp$ .注意每次加一个字符时(假定加在第一个串上),前面的 $dp$ 值不会被影响,只需计算 $f(len_1+1,j,k)$ 这 $250^2$ 个状态.每次删字符时直接让 $len$ 减 $1$ 就可以了.下次会覆盖掉多余的值.
- 时间复杂度 $O(q\cdot 250^2)$.
1 |
|
CF1149C Tree Generator™
- 给的括号序列就是一个欧拉序(进出都记录).
- 容易处理出每个点的 $dep$ ,遇见 $($ 就 $+1$ ,否则 $-1$ .
- 考虑两个点的距离为 $dep_u+dep_v-2dep_{lca}$ ,在欧拉序中.和用 $RMQ$ 做 $LCA$ 一样,两个点的 $lca$ 一定位于这两个点的中间,且深度最小.
- 那么找直径就转化为找三个位置 $u\leq lca\leq v$ ,使得 $dep_u+dep_v-2dep_{lca}$ 最大.
- 每次修改交换两个括号,中间那一段 $dep$ 都会 $+2/-2$ .于是用线段树维护每个位置的 $dep$ , $dep_l-2dep_i$ , $dep_r-2dep_i$ 的 $max$ 即可.
注意合并节点,标记的细节.
1 |
|
CF1149D Abandoning Roads
- 最小生成树 + 状压 $dp$.
- 用 $kruskal$ 做最小生成树的时候,会先考虑权值为 $a$ 的边,那么可以先预处理出由 $a$ 边连接出的联通块.
- 从 $1$ 到 $p$ 跑最短路,每条 $b$ 边会连接两个联通块,将联通块状压,就可以记录哪些联通块已经走过了.
- 注意到对一个点数 $\leq 3$ 的联通块,不可能进入它后再走出去,因为这样的长度至少为 $2b$ ,而它内部长度最长才 $2a$ .所以可以不记这些联通块.状态数目在 $O(2^{n/4}m)$ 级别,就可以直接做了.
CF1149E Election Promises
- 博弈论.
- 结论: $SG_u=mex(SG_v),sum(x)=\oplus_{SG_i=x}h_i$ , $\oplus$ 表示异或和.先手能胜,当且仅当 $\exists x ,sum(x)\not=0$ .
- 如果所有的 $sum$ 都为 $0$ ,那么先手随意操作一次,都会使得有 $sum$ 变为非 $0$ .然后后手再操作一次,所有 $sum$ 又可以被修改为 $0$ :找到最大的 $x$ , $sum(x)>0$ 进行修改.