Loading

POI 题目选做

POI 2013

Price List

设只包含 \(a\) 边的图是 \(G=(V,E)\)

注意到答案只有三种可能:只走 \(a\) 边,走恰好一条 \(a\) 边和若干条 \(b\) 边,以及只走 \(b\) 边。

对于前两种,直接 BFS 即可求出。对于第三种,因为只需要考虑 \(b\) 边,所以仍然可以 BFS。设当前 BFS 到点 \(u\),那么其实就是要枚举 \((u,v)\in E,(v,w)\in E,(u,w)\not\in E\),且 \(w\) 未被 BFS 到过,并令 \(\mathrm{dis}_w=\mathrm{dis}_u+b\)

那么可以将枚举的范围改成 \((u,v)\in E,(v,w)\in E'_v,(u,w)\not\in E\),当枚举到一个新的 \(w\) 时,就把 \((v,w)\) 这条边从 \(E'_v\) 中移除。根据经典结论“无向图中三元环的个数是 \(O(m\sqrt{m})\) 的”,这个做法的时间复杂度是 \(O(m\sqrt{m})\)

注记:关键其实就在于,只包含一种边权的最短路是更简单的,所以需要分离 \(a\) 边和 \(b\) 边对答案的贡献。

Taxis

设这 \(n\) 辆出租车能行驶的里程分别是 \(a_1\le a_2\le \dots \le a_n\),设出租车总站位于 \(x\),终点位于 \(y\)

二分答案,假设当前要判定能否用 \(a_{(n-m+1)\dots n}\) 到达 \(y\)\(x\to y\) 这段肯定需要一辆出租车走完,选择最小的那个 \(i\ge n-m+1\) 使得 \(a_i\ge y-x\) 是最优的。

对于 \(0\to x\) 的路,每次用最大的 \(a_j\),最终只需要判定剩下的那点路能不能与 \(x\to y\) 的路一起走完即可。时间复杂度 \(O(n\log n)\)

注记:如果不二分答案,直接选最小的 \(i\) 使得 \(a_i\ge y-x\),就少考虑了用 \(a_n\) 直接走完全程的情况。

Take-out

直接用一个栈来匹配即可。

Triumphal Arch

二分答案 \(m\)。首先需要一个观察:对于 B 来说,他的最优策略是不会向父亲移动的。于是可以设 \(f_u\) 表示考虑 \(u\) 的子树,根节点已经染黑,至少需要 A 预先额外操作多少次,才能让 A 获胜。转移就是:

\[f_u=\max\left(0,\sum_{v\in \mathrm{son}_u} f_v+|\mathrm{son}_u|-m\right). \]

这里对于儿子是加起来,是因为 A 额外的操作是在 B 移动之前的,我们不知道 B 会移动到哪个儿子里。

Watering Can

直接线段树。

Tales of Seafaring

跑一遍奇偶最短路即可。

Tower Defense Game

枚举每个点 \(i\),若 \(i\) 还没被标记过,则在 \(i\) 上放一座塔,并标记所有与 \(i\) 距离小于等于 \(2\) 的点。

这样是对的,因为在一座塔只能保护相邻的点时,每个点的保护范围是一个菊花状物。而当一座塔能保护距离 \(\le 2\) 的点时,在这个菊花内任选一个点放塔,都能保护这些点。

Bytecomputer

直接 DP。

Colorful Chain

双指针。

Laser

将每个点 \((x,y)\) 映射到 \(\arctan \frac{y}{x}\),由于所有点都在第一象限,所以现在的问题是:给你 \(n\) 个区间 \([l_i,r_i]\),你需要选择 \(k\) 个点,使得每个区间内都至多有一个点,且包含点的区间尽量多。

因为 \(k\le 100\),所以直接离散化以后 DP 就行了:设 \(f_{i,j}\) 表示考虑前 \(i\) 个位置,在其中放了 \(j\) 个点的最大区间个数,预处理 \(c_i\) 表示包含位置 \(i\) 的区间个数,\(l_i\) 表示包含位置 \(i\) 的区间的最小左端点,转移就是 \(f_{i,j}=\max(f_{i-1,j},f_{l_i-1,j-1})\)

posted @ 2022-12-18 17:19  Alan_Zhao_2007  阅读(38)  评论(0编辑  收藏  举报