好题.
$A\ Safe\ Bet$
$25$ 分做法:枚举镜子摆放的位置,模拟光线,每次用 $set$ 找到下一面镜子,修改方向,最后检验是否从 $(R,C)$ 出来.
满分做法:不额外增加镜子,直接模拟光线,若最后从 $(R,C)$ 出来,答案为 $0$ .
否则,模拟反向光线,从 $(R,C+1)$ 反向射入,可以发现放镜子的可行位置为两条光线的所有交点.
用扫描线 + 线段树求交点数目以及字典序最小的交点即可.
考试情况:只写了 $25$ 分的做法.
$std$
1 |
|
$Room\ Service$
$25$ 分做法:一堆特判.矩形的情况答案就是对角线长度 $\times 2$ .
我的 $60$ 分做法:其实就是乱搞,出题人是没有设计这一部分的,也没有卡我.
把每条边 $K$ 等分,拆成 $K+1$ 个点,设 $f(i,j,S)$ 表示从出发点到达第 $i$ 条边上的第 $j$ 个点,已经到达过的边集合为 $S$ 时走过的最短长度.大力转移,时间复杂度为 $O(n^2\cdot2^n\cdot K^2)$ .实际上有很多无用状态.参数 $K$ 取 $200$ 就可以了.
满分做法:若需要到的线段为直线,显然只需要将点 $P$ 关于 $n$ 条边都镜面反射一次,得到 $P’$ , $dis(P,P’)$ 即为答案.
但现在是线段,有可能交点在线段外,此时一定是某一个端点处最优.于是只有端点或交点处的状态有用, $flyod$ 预处理两点间最短路后,枚举第一个到的关键点和最后一个到的关键点,更新答案.时间复杂度 $O(n^3)$ .
考试情况:乱搞获得 $60$ 分.
$std$
1 |
|
$Rain$
满分做法:一个点的水面高度取决于它到边界必须经过的点中的最高海拔.
预处理出边界,从边界上的点出发跑 $Dijkstra$ ,求出每个点的水面高度,然后 $bfs$ 求联通块.
求边界可以先极角排序,从 $x$ 坐标最小的点出发,绕一圈就是边界.
时间复杂度 $O(m\cdot \log m)$ .
考试情况: puts(“0”);
1 |
|