做题记录 26.3.1
UOJ #750. 【UNR #6】小火车
等价于找到 \(S_1,S_2\subset \{a\}\) 使得 \(S_1\ne S_2\) 且 \(\sum S_1\equiv \sum S_2\pmod p\),由于 \(p<2^n\),根据抽屉原理必然有解
折半,设划分为 \(U_1,U_2\),则转化为找到两组不同的 \((x_1,y_1)\) 和 \((x_2,y_2)\),使得 \(x_1,x_2\in U_1\),\(y_1,y_2\in U_2\),\(\sum x_1+\sum y_1\equiv \sum x_2+\sum y_2\pmod p\)
二分合法的 \((\sum x_1+\sum y_1)\bmod p\) 的的取值范围
设目前范围是 \([L,R]\),中点为 \(M\),若 \((\sum x+\sum y)\bmod p\in [L,M]\) 的 \((x,y)\) 的数量 \(>M-L+1\) 则 \([L,M]\) 中必然存在解,否则 \((M,R]\) 中必然存在解
精细实现可以做到 \(O(n2^n)\)
UOJ #823. 【UR #26】铁轨回收
设 \(c_i\) 为一种方案中 \(i\) 的最终量,则 \(c_n<a_n\) 显然无解,\(c_n=b_n\) 时的答案可以由 \(a_n\sim b_n-1\) 退出,因此只考虑计算 \(a_n\le c_n<b_n\) 时的答案
最终答案除以 \((n-1)!\),以下求方案数
枚举 \(a_n\le c_n<b_n\)
考虑 \(dp\),令 \(dp_{i,S,j}\) 表示 \(i+1\sim n\) 中,\(j\) 个 \(c=b\) 的位置,\(a<c<b\) 的位置的 \(c-a\) 的可重集为 \(S\) 的方案数(这里的 \(c\) 表示 \(1\sim i\) 部分需要对 \(i+1\sim n\) 产生的增量)
转移考虑时不断枚举上一个点,枚举其父亲,从其父亲的 \(c\) 中减去当前点的 \(c\)
初始 \(f_{n-1,\{c_n-a_n\},0}=1\),对 \(c_n\) 的答案的贡献为 \(\sum_k dp_{1,\varnothing,0}\),转移则枚举 \(i\) 的状态:
-
若 \(i\) 移到的点 \(c=b\),则 \(k\times f_{i,S,k}\to f_{i-1,S,k+1}\;(0\le k\le n-i)\),此时一部分 \(c_i<b_i\) 的情况被当做 \(c_i=b_i\) 的情况处理,在之后去除
-
若 \(i\) 移到的点 \(c<b\)
-
若 \(c_i<b_i\),枚举 \(c_i\) 和 \(x\in S\),则 \(f_{i,S,k}\to f_{i-1,S-\{x\}+\{x-c_i,c_i-a_i\},k}\;(a_i\le c_i<b_i,x\in S,x\ge c_i)\)
特别地若 \(c_i=0\),则父亲没有其它限制,转移为 \((n-i+1-k)f_{i,S,k}\to f_{i-1,S,k}\)
-
若 \(c_i=b_i\),枚举 \(x\in S\),则 \(f_{i,S,k}\to f_{i-1,S-\{x\}+\{x-b_i\},k+1}\;(x\in S)\)
\(b_i=0\) 时的处理方式类似上一种情况
此时还需要减去前面假定 \(c_i=b_i\) 时的不合法部分,枚举实际的 \(c_i\) 和 \(x\in S\),则 \(-f_{i,S,k}\to f_{i-1,S-\{x\}+\{x-b_i,c_i-a_i\},k}\;(a_i\le c_i<b_i)\)
\(c_i=0\) 时处理情况类似上一种
-
暴力实现,\(O(b_n)\) 枚举 \(a_n\),状态数 \(O(n^2\sum_{i=1}^{b_n}\pi(i))=O(n^2\pi(b_n))\)(其中 \(\pi\) 表示分拆数),每个状态 \(O(b_n^2)\) 转移,无法通过
矩阵转置优化之,可以去掉最外层的 \(O(b_n)\)
每种拆分本质不同的数字只有 \(O(\sqrt{b_n})\) 个,可以预处理每个不同的值的出现次数
时间复杂度 \(O(n^2\pi(b_n)b_n^{2.5})\)
LOJ #6669. Nauuo and Binary Tree
先通过 \(n-1\) 次查询求出每个点的深度,然后逐层扩展
设目前处理完 \(1\sim d\) 层,对这部分重剖,然后依次考虑第 \(d+1\) 层的点 \(x\)
初始令 \(y=1\)
每次令 \(z\) 为 \(y\) 所在重链最底下的点,查询 \(\text{dis}(x,z)\)
容易推算出 \(dep_{\text{lca}(x,z)}\),显然 \(\text{lca}(x,z)\) 必然在 \(y-z\) 的链上,从而可以唯一确定 \(\text{lca}(x,z)\),令 \(y\) 移到这一点
若 \(dep_y=dep_x-1\) 则 \(y\) 为 \(x\) 的父亲
否则,\(z\) 和 \(x\) 在 \(y\) 的不同子树中,由于是二叉树,可以确定 \(x\) 所在的儿子,向下移动一步,再次判断深度是否合法
显然操作次数不超过 \(n\log_2 n+O(n)\),树剖常数小可过
\(\textcolor{grey}\odot\) AT_xmascon22_h Happy Game
枚举 \(u\),可证一个 \(u\) 的答案为 \(\max_{d\mid \exists v,\text{dis}(u,v)>d} \left(d+\left\lceil\frac{\sum_v [\text{dis}(u,v)>d]}2\right\rceil\right)\),原问题的答案为所有 \(u\) 的答案之和
暴力实现为 \(O(n(n+m))\) 的,考虑优化
显然最优情况下到 \(u\) 距离为 \(d\) 的点只有恰好一个,否则 \(d\gets d-1\) 不劣
设这个点为 \(y\),则要么 \(y\) 是割点,要么 \(y=x\) 或 \(y\) 是距离 \(x\) 最远的点,若 \(y=x\) 则对答案的贡献为 \(\lceil\frac{n-1}2\rceil\),直接计入答案即可,之后无需考虑,若 \(y\) 为距离 \(x\) 最远的点则不如选择距离 \(x\) 最远且满足要求的点,因此以下只考虑 \(y\) 为割点的情况
此时令 \(b(x,y)\) 表示删去 \(y\) 后 \(x\) 所在连通块的大小,\(f(x,y)=2\text{dis}(x,y)-b(x,y)\),则对答案的贡献为 \(\lceil\frac{n-1-f(x,y)}2\rceil\),因此转化为求 \(\max f(x,y)\)
显然对于删去 \(y\) 后的某个连通块,\(x\) 选择连通块内到 \(y\) 距离最大的点最优
考虑钦定点 \(v\) 和 \(x\) 属于不同连通块,如何对所有满足要求的 \(x,y\) 求出贡献
以 \(v\) 为根 \(\text{bfs}\) 求出每个点到 \(v\) 的距离,求出圆方树后 \(y\) 取树上全体非叶子圆点,枚举 \(y\) 的所有儿子(显然为方点),\(x\) 取子树中到 \(v\) 最远的,以上过程容易做到 \(O(n+m)\)
可证 \(v\) 取圆方树直径的两端可以覆盖所有最优情况
容易做到 \(O(\sum (n+m))\)

浙公网安备 33010602011771号