2025.3

P1041 传染病控制

相当于在每一个深度都选一个点,并染色其子树。
不能选祖先儿子关系的点,求最多能选多少。
搜索即可,加最优化剪枝。

UVA12991 Game Rooms

构造形如 \(\cdots\)、一段 \(0\)、一段 \(1\)、一段 \(0\)\(\cdots\)
定义 \(f(i,0/1)\)\(i\) 层这只乒乓球桌(\(0\))或游泳池(\(1\)),前 \(i\) 层的最优解。
转移枚举最后一段,转移的 \(w\) 函数为 \([l, r]\) 之间走 \(l-1\)\(r+1\) 的最小距离和。
这个用类似 hash 的二阶前缀和维护。

Submission

远古时期(其实就过了半年多?)写了一份 Code,现在看来漏洞百出。
\(f(i, j)\) 为前 \(i\) 个设置了 \(j\) 个乒乓球场,维护了对应状态的上一个 \(0/1\)\(g\)
你怎么知道从这里转移呢?

UOJ750 小火车

(思考过程)
显然 \(O(3^{\frac{n}{2}})\),考虑如何 \(3\to 2\)
自认为想了一个绝妙的方法。
钦定都选 \(1\),然后选一个集合 \(S_1\)\(\Delta_1 = \sum\limits_{i\in S_1} -a_i\),然后再选一个集合 \(S_2\)\(\Delta_2 = \sum\limits_{i\in S_2} -a_i\),恰满足所有条件。对前一半、后一半都这样做,最后需要从 \(4\)\(\Delta\) 集合里各选出 \(1\) 个,使得 \(a+b+c+d\equiv 0\pmod{mod}\)
这里就不会了。
(现在看来,这个做法是正解第一步的复杂化。)

(以下正解)
对于 \(1\le p\lt 2^n\) 考虑怎么用这个性质,
对于一个数,只有选与不选,和有 \(2^n\) 种,因为 \(p\lt 2^n\),就一定会有一个位置有大于等于 \(2\) 个的选法 \(A, B\)
\(A\) 中全选 \(1\)\(B\) 中全选 \(-1\),结果刚好为 \(0\)

于是折半搜索两边的元素的和,记为 \(S_l,S_r\)
\(a, b\in S_l, c, d\in S_r\),使得 \(a+c-b-d=0\)
这看似很困难,但是我们知道解的范围 \([0,p)\)
于是考虑二分解的范围,
现在的问题就是如何判断 \(a\in S_l,b\in S_r\) 使得 \(a+b\in[l,r]\)

这个直接双指针。

这里有模数,双指针需要满足单调性。
这里,分两次双指针,第二次 \(-p\),这样就统计好了。

HDU3047 Zjnu Stadium

考虑用带权并查集维护每个位置到根的距离 \(d\) 来表示这个位置顺时针 \(d\) 到根。
考虑合并 \(x, y\) 所在集合,\(fx, fy\) 为其分别的根。
由于位移是向量,\(d_{fx} = -d_{x} + dis(x, y) + d_{y}\)

AT_joisc2014_f 友だちをつくろう

发现一个点能到的所有点(不包括自己)构成了完全图。
具有传递性,并查集维护。

ARC156C Tree and LCS

妙。
答案一定是选在两个叶子节点。
发现答案等于 \(1\)
考虑构造。
取出两个叶子节点 \(i, j\),然后 \(x_i = j, x_j = i\)
然后删除这两个点。

P4097 【模板】李超线段树 / [HEOI2013] Segment

可以在每个 \(x\) 维护对应最大的 \(y\)
不妨用懒标记。
考虑线段树,上面每个点的懒标记 \(\mathrm{id}_u\) 表示用线段 \(\mathrm{id}_u\) 来更新这个点代表的区间。
但标记难以合并,只能下传标记。
发现新加入的线段如果更新跨越左右区间,则 \(\mathrm{swap}\)
保证了加入的线段只在一边,递归下去打标记即可。

P4254 [JSOI2008] Blue Mary 开公司

李超板子。
注意收益非负。

「CodeChef」TSUM2 Sum on Tree

树上链问题用点分治。
点分治后,答案形如 \(\mathrm{len}_{front}\mathrm{sum}_{back}+\mathrm{value}_{front}+\mathrm{value}_{back}\)
\(k=\mathrm{sum}_{back}, v=\mathrm{value}_{back}\),李超线段树维护最大值。

P3081 [USACO13MAR] Hill Walk G

(想了很久,没看到性质)

考虑模拟,此时可能会出现删除操作,但李超线段树不能维护。

考虑到所有线段无交且斜率为正,所以在当前跳跃点以上的线段后面一定没用,以下的后面一定有用。

线段按 \(l\) 排序。

CF932F Escape Through Leaf

考虑定义 \(f_u\)\(u\) 到子树内叶子的最小费用。
\(f_u = \min_{v\in \mathrm{subtree}_u}a_ub_v+f_v\)
用李超维护这个东西。
需要用到李超树合并。

注意,李超树只用开 \(O(n)\)

P4655

选择一个包含 \(1, n\) 的集合,然后按 \(h_i\) 相邻两点连边。
不在集合内的贡献是 \(w_i\)
\(s\)\(w\) 的前缀和。
桥梁不能在端点以外的任何地方相交

\[\begin{aligned} & f_0 = h_0 = 0 \\ & f_i = h_i^2+s_{i-1}+\min_{j = 1}^{i - 1} f_j+h_j^2-2h_ih_j-s_{j} \end{aligned} \]

李超线段树优化
\(O(n\log{n})\)

Sol 2
斜率优化
因为没有单调性,考虑 CDQ 分治。

\[f_i = h_i^2+s_{i-1}+\min_{j = 1}^{i - 1} f_j+h_j^2-2h_ih_j-s_{j} \]

则平面上若干形如 \((h_j, f_j+h_j^2-s_j)\) 的点,每次用斜率 \(2h_i\) 去切。
发现只要 \(h\) 满足单调性即可。
分治过程中,先计算 \([l,mid]\)\(f\) 值。
然后对 \([l, mid]\) 建凸包(此时按横坐标排序)更新 \((mid,r]\)\(f\)

递归下去时按 \(id\) 排序,回溯时按横坐标排序。
在更新 \((mid,r]\) 时按横坐标排序,但是右边并没有递归下去。
考虑最开始按横坐标排序。

stable_partition:把 truefalse 前,且不改变 true / false 的相对位置。
inplace_merge:归并排序。

可以做到 \(O(n\log{n})\)

P4069

\(m\) 次操作。
每次给一条路径添加一条线段。
查询路径最小值。

树剖 + 李超线段树
\(O(n\log^3{n})\)

P8726 旅行家

定义 \(f_i\) 为以 \(i\) 结束的最大 \(\text{RP}\)

\[f_i = \max_{j=1}^{i-1} \left\lfloor\frac{f_j}{2}\right\rfloor - F_j + T_iT_j \]

\((T_j,\left\lfloor\frac{f_j}{2}\right\rfloor - F_j)\)\(k = -T_i\)
横坐标和斜率都具有单调性。
可以斜率优化,或者李超线段树。

posted @ 2025-03-31 15:50  Nazq  阅读(34)  评论(0)    收藏  举报