2024.12.12 近期练习
实在是难以相信我竟然又来到了机房训练。
P10141 [USACO24JAN] Merging Cells P
一个简单的 \(dp_{i,l,r}\) 表示最后如果剩下的是 \(i\),当前 \(i\) 所处的区间是 \([l,r]\) 的概率。
区间往外拓展当前仅当当前 \([l,r]\) 区间的和不小于拓展的区间的和。
然而状态数已经达到 \(O(n^3)\),完全无法优化。
注意到初始条件是 \(dp_{i,i,i}=1\),而 dp 是一个路径计数过程,考虑将 DAG 图反置。
也就是原本我们是区间的合并,现在时光倒流,转化为区间的分割来划分子任务。
也就是求从 \([1,n]\) 开始,存在 \([l,r]\) 这样一个区间是被分割的。
考虑区间分割的点 \(p\in[l,r-1]\),是等概率选择的,然后哪边大就贡献到哪边的区间,另一边舍弃。
考虑前缀和优化,维护 \(sum_{l,i}\) 表示左端点为 \(l\),右端点为 \(i\) 时被贡献多少。固定右端点同。
P4437 [HNOI/AHOI2018] 排列
看式子的形式应该是贪心,我们即需要让后面的 \(w_{p_i}\) 尽量大,考虑从后往前填。
那么我们可以得到一个条件就是,要想填 \(a_j\),即 \(a_{p_i}=j\),那么 \(j\) 必须已经被填了。
这非常像一个图论建模。考虑 \(j\) 向 \(a_j\) 连一条边。那么如果不是 DAG 就无解。
如果是 DAG,进一步地其实这就是一棵内向树,考虑从根节点,也就是 \(0\) 号点开始删。
很典是吧,转化为选平均数最小的若干段。取出平均值最小的点 \(x\),然后将 \(x\) 与父亲合并。
合并代表的是,若 \(x\) 父亲被选了,那么下一个一定选的是 \(x\)。然后重复该过程,直到只有一个点。
关于答案的计算,只需要在每次合并的时候累加上 \(w_x\) 乘父亲的大小即可。考虑并查集维护。
这是一个形而上学的问题。
P4654 [CEOI2017] Mousetrap
考虑先给树定根,很显然要定到 \(t\) 这个点。
考虑整个过程是什么样的,老鼠显然最后一直走走到一个叶子节点。
当老鼠被困住的时候,我们可以先堵住不是前往 \(t\) 的所有边,然后再擦除每条去 \(t\) 的边。
而在老鼠走向叶子的过程中,我们可以堵塞其一些道路,我们要堵塞其花费最大代价的道路。
考虑树形 dp 设 \(f_u\) 表示一个子树内的答案,那么 \(f_u=deg_u-1+2nd\max f_v\)。
如果 \(s\) 与 \(t\) 之间只有一条边,那么答案就是 \(s\) 次大的子树代价加上 \(deg_s-1\)。
考虑可以从 \(s\) 往上走再岔进某个子树。这时候比较难算,考虑二分答案 \(v\)。
在往上走的时候,如果有子树的答案超过了当前的 \(v\),就要给他堵住,并使得 \(v\) 减去 \(1\)。
并且,需要堵住的个数不超过当前能用的步数。满足以上的条件 \(v\) 就是合法的。