POI2009合集

2023.12.06~2023.12.07

没和 08 接上是因为去做了写 bitset 和 dp 题目锻炼一下科技和马力。

感觉 bitset 很有前途啊!


有一道计算几何,其他都是没什么人做的,有这时间不如做点典题。

P3479 [POI2009] GAS-Fire Extinguishers

注意到一个位置可以放多个灭火器。

考虑贪心,放在深度更小的地方更优。如果当前子树中存在深度为 $k$ 没被覆盖就在这个点放若干个灭火器。

记 $f_{x,i}$ 表示 $x$ 的子树内深度为 $i$ 需要灭火器的个数,$g_{x,i}$ 表示 $x$ 的子树深度为 $i$ 内放灭火器且还没有覆盖过别的点的可以灭火的个数。

然后还要记得转移自己作为 lca,子树间的。

注意到每次转移一定要贪心的转移距离为 $k$ 的,不然会出错。复杂度 $O(nk)$。

P3480 [POI2009] KAM-Pebbles

5 分钟快速丹砂,感觉是最会博弈论的一集。

看到单调递增考虑差分,也就是保证差分数组始终 $>0$。

考虑一个位置 $i$ 减少 $x$,放在差分数组上就是 $i$ 到 $i+1$ 移动 $x$ 个。这就是阶梯 nim 博弈了。

差点被数据范围诈骗。复杂度 $O(n)$。

P3482 [POI2009] SLO-Elephants

之前做的。经典套路 $(i,p_i)$ 连边看成一堆环。然后分类讨论。复杂度 $O(n)$。

P3485 [POI2009] BAJ-The Walk of Bytie-boy

序列上怎么做?抛开在图上不太可行的 manacher,考虑区间 dp。

令 $f_{x,y}$ 表示从 $x\to y$ 的最短回文路径。转移枚举 $l\to x,y\to r$,如果经过同样的字母,就 $f_{l,r}\gets\min f_{x,y}+2$。

但是这样复杂度应该是 $O(m^2)$ 的,没有前途。

考虑转移拆成两部分,令 $f_{x,y}$ 还是表示 $x\to y$ 的最短回文路径,$g_{x,y,c}$ 表示 $x\to z\xrightarrow{c} y$ 且 $x\to z$ 是回文路径的最短路径。

有转移:

  • $f_{z,y}\gets \min{ g_{x,y,c}}+1,z\xrightarrow{c}x$。

  • $g_{x,z,c}\gets \min {f_{x,y}},y\xrightarrow{c}z$。

用 bfs,且实现的好的话,每个状态只会被转移一次。复杂度 $O(nm+26n^2)$。

为了保证复杂度正确,最好对每条边的起点和边权存终点,减少转移的冗余。

P3486 [POI2009] KON-Ticket Inspector

转化成最少检不到的人数。然后令 $f_{i,j}$ 表示上一个检查在 $i$ ,检查了 $j$ 个,暴力枚举转移点,转移的价值用二维前缀和预处理一下即可。复杂度 $O(n^2k)$。

P3487 [POI2009] ARC-Architects

第 $i$ 个数为在 $[b_{i-1}+1,n-i+1]$ 中最大的数。

发现可以单调队列。复杂度 $O(n)$。注意别开 O2。

P3488 [POI2009] LYZ-Ice Skates

丹砂!虽然好像很水。

Hall 定理,对于任意的集合,后面忘了。

但是其实集合的限制不如区间,因为任意区间满足了任意集合一定满足(把集合空的补满的限制更强),转化为 $\forall l\le r,\sum\limits _{i=l}^r a_i\le (r-l+1+d)\cdot k$,移项有 $\sum a_i-k\le d\cdot k$,也就是求最大子段和。

线段树维护即可,复杂度 $O((n+m)\log n)$。

P3489 [POI2009] WIE-Hexer

观察到 $p$ 很小,直接状态压缩。然后跑 dj 。

复杂度 $O((n+m)2^pp\log (n+m))$,反证能过。

P3492 [POI2009] TAB-Arrays

观察到每一行/列的元素集合组成不变。

每个数不同,所以随便判一下就好了。复杂度 $O(n)$。