做题记录 25.8.2
\(\textcolor{purple}\odot\) CF1632E2 Distance Tree (hard version)
令 \(ds_u\) 为 \(u\) 到 \(1\) 的距离
显然最优情况下选择的路径一端一定为根,否则假设选了 \((u,v)\)(\(ds_u\ge ds_v\))则易得换为 \((1,u)\) 一定不劣
对于一个 \(x\),考虑判定一个值 \(rs\) 能否成为答案(即是否有最小值 \(\le rs\)),由于 \(x\) 递增时答案不降,因此用双指针转化为 \(O(n)\) 次判定 \((x,rs)\) 是否合法
\((x,rs)\) 合法当且仅当存在点 \(u\),使得对于任意 \(ds_v>rs\) 的点都有 \(dis(u,v)\le rs-x\)
特判 \(rs\ge \max_u ds_u\) 的情况,此时显然合法
否则找到 \(S=\{v\mid ds_v>rs\}\)(此时 \(S\ne\mathbb\emptyset\))中距离最远的一对点 \((x,y)\),取 \(u\) 为两者的一中点,\(v\) 为距离中点较远的一端,需要有 \(\left\lceil\frac{dis(x,y)}2\right\rceil\le rs-x\)
显然 \(dis(x,y)\) 只和 \(rs\) 有关,因此考虑预处理 \(f_{rs}\) 表示对应的 \(dis(x,y)\)
找到 \(ds\) 最大的点 \(r\),则 \(f_d=\max(f_{d+1},\max_{ds_u=d+1}dis(u,r))\)
容易 \(O(n)\) 预处理
总时间复杂度 \(O(\sum n)\)
\(\textcolor{blue}\odot\) CF1630D Flipping Range
令 \(b=\{\gcd b\}\) 答案不变
证明:
- 若存在 \(x\in b,y\in b,y>x\),考虑所有长度为 \(y-x\) 的区间 \([l,l+y-x)\)(下标从 \(0\) 开始)
- 当 \(l\ge x\) 时,翻转 \([l-x,l+y-x)\) 和 \([l-x,l)\),等价于翻转 \([l,l+y-x)\)
- 当 \(l<x\) 时,翻转 \([l,l+y)\) 和 \([l+y-x,l+y)\),等价于翻转 \([l,l+y-x)\)(由于 \(x,y\le \frac n2\),因此 \(l+y<x+y\le n\) 在范围内)
- 可以认为 \(y-x\) 也在 \(b\) 中
- 反复迭代,可认为 \(\gcd(x,y)\) 在 \(b\) 中,且显然 \(\gcd(x,y)\) 可以替代 \(x\) 和 \(y\),删去 \(x,y\) 后加入 \(\gcd(x,y)\)
- 重复直到 \(|b|=1\) 即可
令 \(g=\gcd b\),则问题转化为每次翻转 \(a\) 一个长度为 \(g\) 的区间,求总和的最大值
令 \(s_i\) 表示最终 \(i\) 位置是否翻转,则 \(s\) 可达当且仅当对于任意 \(0\le i<g\),有 \(\bigoplus_d [d\equiv i\pmod g]s_d\) 相同
证明:
- 令 \(t_i=\bigoplus_d[d\equiv i\pmod g]s_d\)
- 显然初始 \(t_i=0\),每次操作后所有 \(t_i\) 都翻转
- 因此 \(t\) 都相同是 \(s\) 合法的必要条件
- 考虑构造操作以证明充分性
- 对于最终状态 \(s'\),若 \(t'_i=1\),则从初始状态 \(s\) 开始先翻转 \([0,g)\),反之不操作
- 对于一个等价类 \(\{0\le d<n\mid d\equiv i\pmod g\}\),若能同时翻转 \(d\) 和 \(d+g\) 位置,则这一等价类在 \(t_i\) 不变的情况下可以任意改变 \(s\) 中对应位置
- 显然翻转 \([d,d+g)\) 和 \((d,d+g]\) 即可实现这一点
- 从而得到充分性
考虑每个 \(\bmod g\) 的等价类 \(i\),令 \(f_{i,0}\) 表示等价类中选择偶数个位置翻转得到的 \(a\) 的总和的最大值,\(f_{i,1}\) 表示选择奇数个位置翻转,容易 \(O(n)\) \(dp\) 出,最终答案为 \(\max (\sum f_{\ast,0},\sum f_{\ast,1})\)
时间复杂度 \(O(\sum(n+m+\log V))\)
\(\textcolor{purple}\odot\) CF1628D2 Game on Sum (Hard Version)
令 \(f_{i,j}\) 表示 \(n=i,m=j\) 时的答案,显然 \(f_{i,i}=ik\),\(f_{i,0}=0\),转移为
显然 \(f_{i-1,j-1}\le f_{i-1,j}\),取 \(x=\frac{f_{i-1,j}-f_{i-1,j-1}}2\),有
这样得到一个 \(O(nm)\) 的算法
考虑一个 \(f_{i,i}\) 对 \(f_{n,m}\) 的贡献,显然需要除 \(n-i\) 次 \(2\),总贡献为
因此答案为
特判 \(n=m\) 的情况
总时间复杂度 \(O(\max n+\sum m)\)
\(\textcolor{purple}\odot\) CF1626F A Random Code Problem
显然第 \(k\) 次修改不影响答案,因此实际用到的对 \(a\) 的修改为 \(1\sim k-1\)
对于变换 \(a\gets a-a\bmod i\) 和 \(a\equiv b\pmod { \text{lcm}(1,2,3,c\dots,k-1)}\),显然 \(a,b\) 变换后增量相同
令 \(m=\text{lcm}(1,2,3.\cdots,k-1)\)
令所有 \(a_i\gets a_i\bmod n\),并在这之前令答案加上 \(kn^{k-1}\lfloor\frac{a_i}m\rfloor m\)
令 \(c_i\) 为 \(a\) 中 \(i\) 的数量
令 \(f_{c,v}\) 表示第 \(c\) 次操作后值 \(v\) 在 \(a\) 中的期望出现次数乘以 \(n^c\)
显然 \(f_{0,v}=c_v\)
转移为
答案为 \(\sum_{0\le c<k}\sum_{0\le v<m} vf_{c,v} n^{k-c-1}\) 加上前面部分累计的总和
时间复杂度 \(O(n+km)\),其中 \(m=\text{lcm}(1,2,3,\cdots,k-1)=O(e^{k+o(k)})\)
\(\textcolor{purple}\odot\) CF1626E Black and White Tree
考虑对于一个点 \(u\) 求解
以 \(u\) 为根,令 \(s_u\) 为子树内 \(1\) 的数量,令 \(f_u\) 表示从 \(u\) 向下是否能到达 \(1\)
显然
换根 \(dp\) 即可,时间复杂度 \(O(n)\)
\(\textcolor{purple}\odot\) CF1625E2 Cats on the Upgrade (hard version)
将括号按包含关系建成树,忽略 . 和未匹配的括号,则一次修改等价于删去一个叶子
一次区间查询中,对于一个完全位于区间内的子树 \(u\),它对答案的贡献为 \(\frac{s_u(s_u+1)}2\),其中 \(s_u\) 表示 \(u\) 剩余儿子数量,令极大的完全包含于区间中的子树数量为 \(x\),则贡献为 \(\frac{x(x+1)}2\)
建立两个树状数组,第一个按 \(dfn\) 维护区间内 \(\frac{s_u(s_u+1)}2\) 的和,容易维护这部分对答案的总贡献,第二个按类似 \(\text{bfs}\) 序的方式维护区间内还存在的结点数量,容易计算第二部分的总贡献
总时间复杂度 \(O((n+q)\log n)\)

浙公网安备 33010602011771号