做题记录 25.8.14
\(\textcolor{purple}\odot\) CF1585G Poachers
令 \(f_{u,l}\) 表示子树 \(u\) 中,距离 \(u\) 恰好为 \(l\) 的所有点 所在子树的 \(\text{SG}\) 函数值 的异或和,令 \(l_u\) 表示子树 \(u\) 中离 \(u\) 最近的叶子到 \(u\) 的路径上的点的数量,显然转移为
暴力实现为 \(O(n^2)\) 的,考虑长剖优化
一条长链上的 \(f\) 共用空间,起始位置,依次偏移 \(1\)
第一种转移是容易的,暴力实现即为 \(O(n)\)
考虑一个集合 \(S\),要求插入删除并维护 \(\text{mex}\),且值域一定,则可保存其补集和值域内所有数的出现次数,从而各种操作做到 \(O(\log n)\)
每条长链保存一个这样的结构,\(\text{dfs}\) 到链上 \(u\) 点时,集合内保存 \(\{f_{u,i}\}_{i=1}^{l_u}\)
若 \(u\) 不止一个儿子或没有儿子,则暴力清空集合后再暴力插入,否则维护增量
总时间复杂度 \(O(\sum n\log n)\)
\(\textcolor{blue}\odot\) CF1583F Defender of Childhood Dreams
先每 \(k\) 个点作为一个一类组,组内点互相连边权为 \(1\) 的边,然后每 \(k\) 个一类组作为一个二类组,组内还没有连边的点对之间连边权为 \(2\) 的边,以此类推
显然符合要求,可证颜色数最小
容易做到 \(O(n^2\log_k n)\)
\(\textcolor{blue}\odot\) CF1582G Kuzya and Homework
令 \(v_i=\begin{cases}a_i&\text{if}~ b_i=\text{'*'}\\\frac1{a_i}&\text{if}~b_i=\text{'/'}\end{cases}\),则等价于询问有多少个区间满足区间内任意前缀积都是整数
令 \(ct_{p,i}\) 表示 \(\prod_{j=1}^i v_j\) 中因子 \(p\) 的指数,则每个 \(a_i\) 对 \(ct\) 的影响为 \(O(\omega(V))\) 个 \(ct_{p,\ast}\) 的后缀加
区间 \([l,r]\) 合法当且仅当对于任意 \(p\),有 \(ct_{p,l-1}\le ct_{p,r}\),令 \(r_{l-1}\) 为左端点取 \(l\) 时第一个不合法的右端点,容易由 \(r\) 得到答案
考虑每个 \(ct_{p,\ast}\),容易得到若干 \([l,r,v]\) 表示 \(ct_{p,l\sim r}=v\),逆序扫描所有区间,容易对每个区间找到右侧第一个值小于它的位置,从而跟新 \(r\)
总时间复杂度 \(O(n\omega(V)\log n)\)
\(\textcolor{blue}\odot\) CF1582F2 Korney Korneevich and XOR (hard version)
枚举 \(a_i\),令 \(f_{i,j}\) 表示最后一项 \(<i\) 时异或和能否等于 \(j\)
初始 \(f_{\ge 1,0}=1\),枚举到 \(a_i\) 时,对于所有 \(f_{a_i,k}=1\),枚举 \(j>a_i\),令 \(f_{j,k\oplus a_i}\gets 1\)
暴力实现为 \(O(nV^2)\) 的
发现对于每个 \(v\),\(f_{\ast,v}\) 覆盖的为一段后缀,令 \(mx_v\) 表示最后一个没有被覆盖的位置,则只要枚举 \(a_i<j\le mx_{j\oplus a_i}\),最后 \(mx_{j\oplus a_i}\gets a_i\) 即可
这样时间复杂度为 \(O(nV+V^2)\),若用 bitset<>::_Find_first,bitset<>::_Find_next 则可做到 \(O(\frac{nV}\omega +V^2)\)
对于每个 \(f_{i,\ast}\) 开一个桶 \(b_i\),表示 \(f_{i,j}=1\) 且还没有拓展过的 \(j\) 的集合
初始 \(b_i=\{0\}\),枚举到 \(a_i\) 时,对于所有 \(k\in b_{a_i}\),枚举 \(a_i<j\le mx_{j\oplus a_i}\),此时 \(k\oplus a_i\) 为答案,\(b_{j}\) 中插入 \(k\oplus a_i\),然后令 \(mx_{j\oplus a_i}\gets a_i\),最后清空 \(b_{a_i}\)
时间复杂度 \(O(n+V^2)\),空间复杂度 \(O(V^2)\)
\(\textcolor{purple}\odot\) CF1580B Mathematics Curriculum
等价于排列建出的笛卡尔树中有 \(k\) 个点的深度为 \(m\),其中深度定义为到根的路径上的点数
令 \(f_{i,j,k}\) 表示大小为 \(i\) 的树中有 \(j\) 个结点深度为 \(k\) 的方案数
转移为
时间复杂度 \(O(n^5)\),注意常数
\(\blue\odot\) CF1578L Labyrinth
建立图的重构树,令 \(f_u\) 表示只考虑子树 \(u\) 的答案,令 \(s_u\) 表示子树 \(u\) 内 \(c\) 之和,考虑一次合并 \((u,v,w)\)
假设先和并子树 \(u\) 内所有 \(c\),显然在此过程中合并一部分 \(v\) 中的 \(c\) 不优,因此两棵子树遍历过程独立,设合并后的子树为 \(t\)
遍历完 \(u\) 后要能穿过 \(w\),且能遍历 \(v\),则 \(f_t+s_u\le \min(f_v,w)\),即 \(f_t\le \min(f_v,w)-s_u\),若从 \(v\) 出发则 \(f_t\le \min(f_u,w)-s_v\),两者取 \(\max\) 得 \(f_t=\max(\min(f_v,w)-s_u,\min(f_u,w)-s_v)\)
答案为重构树的根的 \(f\)(若 \(\le 0\) 则无解)

浙公网安备 33010602011771号