做题记录 25.4.15
\(\textcolor{purple}\odot\) CF487E Tourists
建出圆方树,转化为求圆方树的一条路径上所有的方点的邻点中权值的最小值
每个方点的权值定为其儿子的权值的最小值,则转化为求路径最小值,注意 \(\text{lca}\) 处可能需要额外加入一个点的权值
树剖即可
时间复杂度 \(O(n\log n)\)
\(\textcolor{blue}\odot\) CF2091G Gleb and Boating
显然 \(s\ge k^2\) 且 \(k\mid s\) 时答案为 \(k\),\(s\ge k^2\) 且 \(k\nmid s\) 时答案为 \(k-2\),因此只要考虑 \(s<k^2\) 的情况
对于这种情况,使用 bitset 保存能到达的位置,从 \(k\) 到 \(1\) 枚举步长 \(l\),然后从 \(1\) 到 \(\lfloor\frac sl\rfloor\) 枚举步数,注意需要删除 \(>s\) 的位置
答案下界为 \(O(\sqrt s)\),时间复杂度 \(O(\sum [s<k^2]\frac{s}\omega\sum_{i=\sqrt s}^k \frac {s}i)=O(\sum [s<k^2]\frac {s^2}\omega(\ln k-\ln \sqrt s))\),实际上约为 \(\frac {2\times10^{10}}\omega\) 可过
\(\textcolor{black}\odot\) P7126 [Ynoi2008] rdCcot
假设在距离 \(\le c\) 的点之间连边,对于一组询问 \([l,r]\),只保留 \([l,r]\) 内点的情况下,考虑在每个连通块中 \(\text{bfs}\) 序最小的点处统计
可证 \(l\le u\le r\) 为一个连通块中 \(\text{bfs}\) 序最小的点当且仅当它没有连向 \(\text{bfs}\) 序更小的点的边
令 \(bfn\) 表示 \(\text{bfs}\) 序,则询问 \(l,r\) 转化为计算
考虑对于每个 \(u\) 计算 \(pr_u\) 和 \(sf_u\),\(pr_u\) 为满足 \(v<u,bfn_v<bfn_u,\text{dist}(u,v)\le c\) 的最大的 \(v\),不存在则为 \(0\),\(sf_u\) 为满足 \(v>u,bfn_v<bfn_u,\text{dist}(u,v)\le c\) 的最小的 \(v\),不存在则为 \(n+1\),则询问 \(l,r\) 的答案为 \(\sum_u [l\le u\le r][pr_u<l][sf_u>r]\),即一个 \(u\) 会令所有询问 \(l,r\;(pr_u<l\le u,u\le r<sf_u)\) 的答案加一,这部分容易离线后扫描线实现,时间复杂度 \(O(m\log n)\)
问题转化为计算 \(pr\) 和 \(sf\),考虑点分治,令 \(M\) 为此时分治中心,\(S\) 为当前分治连通块内的点集,\(d_u\) 为 \(u\) 到 \(M\) 的距离,则此时需要对于每个 \(u\in S\),求出 \(\max\{v\in S\mid v<u,bfn_v<bfn_u,d_u+d_v\le c\}\) 和 \(\min\{v>u,bfn_v<bfn_u,d_u+d_v\le c\}\)
将 \(S\) 内点按 \(bfn\) 从小到大排序,然后依次扫描,则转化为向 \(T\) 中插入一个 \((u,d_u)\) 和查询 \(\max\{v\mid (v,d_v)\in T,v<u,d_v\le c-d_u\}\) 与 \(\min\{v\mid (v,d_v)\in T,v>u,d_v\le c-d_u\}\),容易平衡树上二分实现
时间复杂度 \(O(n\log^2 n+m\log n)\),需要注意常数
\(\textcolor{blue}\odot\) P12075 [OOI 2025] Dreaming is not harmful
先求出 \(\text{od}_i\) 表示在不删去任意一点的情况下,点 \(i\) 被选择的时间,\(\text{pt}_i\) 表示不删去任意一点的情况下,第 \(i\) 个被选择的点
则对于点 \(x\),令 \(S=\{\text{pt}_u\mid 1\le u<\text{od}_x\}\),点 \(x\) 的答案为 \(\min_{u\in S}|S-\text{subtree}(u)|=|S|-\max_{u\in S}|S\cap\text{subtree}(u)|\)
从 \(\text{pt}_1\) 到 \(\text{pt}_n\) 扫描,设当前点为 \(u\),则令 \(1\) 到 \(u\) 的链上所有点的值减去 \(\inf\),\(u\) 的答案为目前点 \(u\) 的值,然后令 \(1\) 到 \(u\) 的链上所有点的值加上 \(\inf+1\)
树剖实现,时间复杂度 \(O(n\log^2 n)\),可替换为全局平衡二叉树做到 \(O(n\log n)\)
\(\textcolor{black}\odot\) P5311 [Ynoi2011] 成都七中
考虑把点权 \(\in [l,r]\) 转化为边权的限制
令每条 \((u,v)\) 的边权为 \(\max(u,v)\) 得到树 \(T_1\),则一条路径所有点权都 \(\le r\) 等价于所有边权都 \(\le r\)
同理边权取 \(\min(u,v)\) 得到 \(T_2\),描述 \(\ge l\) 的限制
求出两者的重构树 \(T_1^R\) 和 \(T_2^R\)
对于一组询问 \((l,r,x)\),令 \(u\) 为 \(T_1^R\) 中 \(x\) 最浅的祖先满足权值 \(\le r\),\(v\) 为 \(T_2^R\) 中 \(x\) 最浅的祖先满足权值 \(\ge l\),则询问的答案等于 \(T_1^R\) 中子树 \(u\) 和 \(T_2^R\) 中子树 \(v\) 内点的交中颜色数量,其中找祖先的过程可通过树剖或倍增 \(O(m\log n)\) 实现
每组询问 \((l,r,x)\) 转化为 \((u,v)\),挂在 \(T_1^R\) 中的 \(u\) 下
对 \(T_1^R\) 进行 \(\text{dsu}\),则转化为对于 \(T_2^R\) \(O(n\log n)\) 次加入点、删除点,\(O(n)\) 次求子树内颜色数量
可以拍为序列后转化为单点修改区间数颜色,但有更简单的方式:
考虑某一种颜色,它能贡献到的点为这种颜色的所有点到根的链并,对于每种颜色保存一个 set,其中按 \(T_2^R\) 中的 \(dfn\) 保存这种颜色的点,则对链并的影响转化为 \(O(1)\) 次点到根的链修改
将其视为单点修改,则原本的单点查询转化为求区间和,树状数组即可
时间复杂度 \(O(n\log^2 n+m\log n)\),空间可做到 \(O(n+m)\)
\(\textcolor{blue}\odot\) CF2089B2 Canteen (Hard Version)
显然答案上限为 \(n\)
二分答案,转化为求出进行 \(M\) 次修改所需最小操作次数
把 \(a\) 和 \(b\) 复制一份接到末尾
用一个栈保存目前还没有清空的 \(a\) 的位置
从 \(1\) 到 \(2n\) 扫描,设当前扫到 \(i\)
若 \(a_i>0\) 则 \(i\) 压入栈
若栈非空且 \(b_i>0\),取出栈顶 \(p\)
若 \(p-i+1>M\),则 \(b_i\) 无法与 \(a_p\) 相消,要使 \(a_p=0\) 必须使用 \(a_p\) 次操作,答案累加 \(a_p\),然后清空 \(a_p\) 和 \(a_{p+n}\)(如果有),并弹栈
否则令 \(mn=\min(b_i,a_p)\),令 \(b_i,a_p,b_{i+n},a_{p+n}\) 都减去 \(mn\),若 \(a_p=0\) 则弹栈
时间复杂度 \(O(n\log n)\)

浙公网安备 33010602011771号