#P8876. [传智杯 #5 初赛] H-二人的世界
[传智杯 #5 初赛] H-二人的世界
题目背景
莲子设计了一个三维立体空间软件。这个软件可以模拟真实的物理引擎,包括实体方块和水流方块。然而,同时计算大量水流会对软件造成不小的负荷。
于是,莲子希望找到这样一种算法,快速计算这些水流模拟后的结果。
题目描述
莲子设计的水流模型是这样的:
考虑一个三维空间。这个空间内有 个正方体。我们使用坐标 描述每个正方体的位置。这些正方体,可以被称作实体方块。
现在将会在这张图中模拟一种水流机制。具体而言,我们会定义水方块。水方块会有一个强度 ,范围是 。
运行逻辑
- 假定 处有强度为 的水方块,且 位置没有实体方块,那么下一时刻 位置会生成强度为 的水方块。注意:无论此时 的值是多少,在 位置生成的水方块的强度都是 。
- 假定 处有强度为 的水方块,且 ,且 位置有实体方块,那么会进行扩散操作。
- 如果下一时刻,某个位置 同时有多个水方块会生成,那么最终生成的水方块的强度,是这些可能生成的水方块里,最大的强度。
扩散操作
考虑到扩散操作比较抽象,建议结合图示理解。
对于水方块 ,它会在高度 的平面上进行寻路。为了考虑这个过程,我们考虑这个高度为 的平面:
- 如果空间里 位置有实体方块存在,那么平面上 处不可经过。否则,如果没有实体方块,那么 处可以经过。
- 在 可以经过的情况下,如果空间里 位置没有实体方块存在,那么平面上 位置称为目标位置。目标位置可以不止一个。
根据扩散的前提条件,可知平面上 位置可以经过,但不是目标位置。
从平面上 处出发,进行路径的搜索。每次在 位置会向 位置扩展。搜索过程会找到距离 位置最近的,且距离不超过 的所有目标位置,或者找不到这样的目标位置。
- 如果存在这样的目标位置,那么在到达目标位置的最短路的方向上,下一时刻会生成一个强度为 的水方块。
- 如果不存在这样的目标位置,那么下一时刻,会向 位置都生成强度为 的水方块(如果这个位置可以到达的话)。
请结合图示理解扩散过程。
如图所示。 处是平面上该水方块所在的位置。白色的方块是目标位置,打 的方块是不可经过的位置。我们计算出 到达最近的目标位置的最小值 ,图中标出来的红色路径就是三条可能的最短路。
如果 ,那么下一时刻,在蓝色箭头处会有强度为 的水方块生成。否则,若 ,那么下一时刻除了蓝色箭头外,灰色路径对应的方向也会生成强度为 的水方块。
为了检验水流模型的合理性以及其运行效率,莲子提出了这个问题:在 处,有一个强度为 的水方块。询问:在经过充分长的时间后(比如经过了 时刻),有多少个点对 ,满足在 位置,会有水方块生成过。
输入格式
- 第一行有两个正整数 和两个整数 ,描述实体方块的个数、水方块最大强度,以及初始水方块的位置。
- 接下来 行,每行三个整数 ,描述每个实体方块的位置。保证不存在两个位置完全相同的实体方块。
输出格式
- 输出共一行一个整数,表示有多少个点对 ,使得充分长时间后 位置有水方块生成过。
8 3 3 4
4 3 1
4 4 1
3 3 2
3 4 2
4 5 2
5 4 2
2 4 3
4 1 4
3
8 2 3 4
4 3 1
4 4 1
3 3 2
3 4 2
4 5 2
5 4 2
2 4 3
4 1 4
1
提示
样例 1 解释
(图片实在太难画啦,将就一下吧。)为了防止方块阻挡导致看不见,方块全部换成了透明的。
初始状态下一根水流柱从高空落下,落在了方块 上,进行了扩散。水方块的坐标为 ,强度为 。
- 如图 ,根据寻路机制,它会在 和 上生成强度为 的水方块。
- 如图 ,生成的两个支流下方都没有方块,于是在 和 上生成强度为 的水方块。
- 如图 ,水方块 下方依旧没有实体方块,于是在 生成了强度为 的水方块,一直流到 ;水方块 下方有实体方块,于是在 生成了强度为 的水方块。
下面只关心水方块 。它下面有实体方块 ,于是它向两边扩散,生成强度均为 的两个水方块。这两个方块下面都不再有实体方块,于是一直往下流到 和 。
因此,最终一共会有三个位置 、、 有水方块经过。
数据范围及约定
对于所有数据,,,,。