1 条题解
-
0
题目分析
本题需要计算在无限时间后,IOI 热病最多能感染多少居民。关键在于分析居民在不同方向选择下是否可能相遇,从而传播疾病。
核心思路
1. 相遇条件分析
两个居民 和 能在某个时刻相遇,当且仅当存在方向选择使得他们的路径相交。通过坐标变换和几何分析,可以将这个问题转化为图论问题。
2. 坐标变换技巧
代码中使用了多种坐标变换:
- 旋转和缩放坐标系
- 将曼哈顿距离问题转化为更易处理的形式
- 通过不同的变换角度(0°, 90°, 180°, 270°)覆盖所有可能的方向组合
3. 图论建模
- 将居民视为图中的节点
- 如果两个居民可能相遇,则在它们之间建立有向边(表示感染可能传播)
- 使用 Dijkstra 算法计算从居民 1 出发最多能到达的节点数
主要步骤
-
坐标预处理
- 将所有坐标相对于居民1进行平移
- 乘以2避免浮点数运算
-
四种方向变换
fo(i,0,3){ fo(j,1,n) swap(q[j].x,q[j].y),q[j].x*=-1; work(); } -
几何关系建立
- 根据坐标和方向状态分组
- 建立居民之间的相遇关系
- 使用multiset维护几何约束
-
Dijkstra算法扩展
- 从感染源居民1开始
- 根据几何关系逐步扩展可能被感染的居民
- 维护每个居民被感染的最早时间
关键优化
- 坐标离散化:处理大范围坐标值
- 扫描线技巧:高效处理几何关系
- 多角度覆盖:通过4次旋转确保覆盖所有可能的方向组合
- 集合维护:使用multiset动态维护和查询几何约束
复杂度分析
- 坐标变换:
- 排序和分组:
- 图构建:
- Dijkstra算法:
- 总复杂度:,能够处理 的数据规模
总结
本题的难点在于将几何运动问题转化为图论问题。通过巧妙的坐标变换和几何分析,结合高效的图算法,成功解决了在无限时间内疾病传播的最大范围问题。
- 1
信息
- ID
- 4947
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者