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(len1,len2,len3)≤n 是否成立.成立则为 YES ,否则为 NO .
- 并不能 O(q⋅2503) 暴力 dp .注意每次加一个字符时(假定加在第一个串上),前面的 dp 值不会被影响,只需计算 f(len1+1,j,k) 这 2502 个状态.每次删字符时直接让 len 减 1 就可以了.下次会覆盖掉多余的值.
- 时间复杂度 O(q⋅2502).
1 |
|
CF1149C Tree Generator™
- 给的括号序列就是一个欧拉序(进出都记录).
- 容易处理出每个点的 dep ,遇见 ( 就 +1 ,否则 −1 .
- 考虑两个点的距离为 depu+depv−2deplca ,在欧拉序中.和用 RMQ 做 LCA 一样,两个点的 lca 一定位于这两个点的中间,且深度最小.
- 那么找直径就转化为找三个位置 u≤lca≤v ,使得 depu+depv−2deplca 最大.
- 每次修改交换两个括号,中间那一段 dep 都会 +2/−2 .于是用线段树维护每个位置的 dep , depl−2depi , depr−2depi 的 max 即可.
注意合并节点,标记的细节.
1 |
|
CF1149D Abandoning Roads
- 最小生成树 + 状压 dp.
- 用 kruskal 做最小生成树的时候,会先考虑权值为 a 的边,那么可以先预处理出由 a 边连接出的联通块.
- 从 1 到 p 跑最短路,每条 b 边会连接两个联通块,将联通块状压,就可以记录哪些联通块已经走过了.
- 注意到对一个点数 ≤3 的联通块,不可能进入它后再走出去,因为这样的长度至少为 2b ,而它内部长度最长才 2a .所以可以不记这些联通块.状态数目在 O(2n/4m) 级别,就可以直接做了.
CF1149E Election Promises
- 博弈论.
- 结论: SGu=mex(SGv),sum(x)=⊕SGi=xhi , ⊕ 表示异或和.先手能胜,当且仅当 ∃x,sum(x)≠0 .
- 如果所有的 sum 都为 0 ,那么先手随意操作一次,都会使得有 sum 变为非 0 .然后后手再操作一次,所有 sum 又可以被修改为 0 :找到最大的 x , sum(x)>0 进行修改.
Gitalking ...