1 条题解
-
0
思路
选择坐标正方向从队伍前方指向后方,条件 就要求 。建立从 到 、权值为 的边,以及从 到 、权值为 的边。
一个连通分量中的所有相对坐标都由任意一个起点的坐标决定。不同连通分量之间没有约束,因此可以分别将各自起点设为 。
做法
维护访问标记和 64 位整数坐标。枚举所有士兵,每遇到一个尚未访问的点,就把它的坐标设为 ,加入队列,开始一次广度优先遍历。
从 沿权值为 的边到达 时:若 未被访问,则令 并入队;若 已被访问,则检查 是否等于 。任何一条边不满足等式时,答案为
NO;所有分量的全部边都满足时,答案为YES。边必须按输入完整保留,重边可能一致也可能矛盾。不能只搜索包含士兵 的分量,不能把零坐标当作未访问标记,也不能认为 就代表每个分量至多有一个环。使用队列可以避免长链上的递归栈溢出。
正确性证明
在一个分量中固定起点坐标为 ,不会损失任何方案:任意可行方案都可以将该分量的全部坐标减去起点坐标,而不改变任何坐标差。
遍历到一个新点时,连接它的边要求它的坐标必须等于已经确定的前驱坐标加边权。因此归纳可知,算法赋出的每个坐标都是任何起点坐标为 的可行方案必须采用的值。
若算法发现某条边的等式不成立,两端的坐标又已经被之前的边强制确定,则不存在同时满足这些条件的方案。若所有边都通过检查,算法构造出的坐标直接满足每条输入条件,因而就是一组合法安排。对所有分量分别执行以上过程,得到全题答案。
部分分做法
子任务 1 中,每个分量选最小编号点为坐标 。沿生成树的简单路径至多经过 条边,所以其他点的坐标一定落在 内。枚举其余点的整数坐标,直接检查全部条件即可;赋值过程中也可以提前检查两端均已赋值的等式。
子任务 2 可以使用稠密矩阵,保存两个点之间目前已知的位移。用 Floyd 式枚举中间点,合并两条已知路径;若已有位移与新路径的位移不同,就产生矛盾。若闭包过程中没有矛盾,则同一分量内所有路径的位移一致,可据此构造坐标。
子任务 3 中,条件只连接相邻编号。将端点按编号递增排列,并在必要时将 取反。对于每对相邻编号,只要它们的所有条件要求同一个位移,就可以依次选择每个相邻间隙的大小;没有条件的间隙可以任意选择。用有序映射保存各间隙的要求即可。这里仍需检查重复条件是否冲突。
一般情形使用上述迭代图遍历,也可以用维护到根坐标差的带权并查集。
复杂度
满分做法中,每个点进入队列一次,每条输入条件对应两条有向边,各处理一次,所以时间复杂度为 ,空间复杂度为 。所有测试的总复杂度为 ,因为每组都有 。
坐标的绝对值可能达到 ,必须使用 64 位整数。稠密闭包的时间、空间复杂度分别为 、;相邻编号分支采用有序映射时为 时间、 空间。
- 1
信息
- ID
- 1692
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者