#THU2021014. [清华预推免机试 2021 校外] 水滴
[清华预推免机试 2021 校外] 水滴
时间限制: 2.0 秒 3.0 秒
空间限制: 512 MB
由于评测机性能问题,我们对时间限制做出相应调整。
题目描述
这是一个经典的游戏。
在一个 的棋盘上,每一个格子中都有一些水滴。玩家的操作是,在一个格子中加一滴水。
当一个格子中的水滴数超过了 ,这一大滴水就会因格子承载不住而向外扩散。扩散的规则是这样的 :
这个格子中的水滴会消失,然后分别向上、左、下、右, 个方向发射一个水滴。如果水滴碰到一个有水的格子,就会进入这个格子。否则水滴会继续移动直到到达棋盘边界后消失。扩散后,水滴进入新的格子可能导致该格子的水滴数也超过 ,则会立即引发这个格子的扩散。我们规定,每个格子按逆时针顺序从上方向开始,递归处理完每一个方向的扩散以及其引发的连锁反应 ,再处理下一个方向的扩散。
给定棋盘的初始状态和玩家的操作,求最后水滴的分布情况。
由于把水滴在一个空格看起来用处不大,所以保证所有的玩家操作都不会选择空格。
提示:可以记录每个水滴上下左右方向第一个水滴的位置,扩散时根据规则模拟,并在每次操作后维护。
输入格式
从标准输入读入数据。
第一行四个整数 。
接下来 行,每行三个正整数 ,表示初始棋盘上第 行 列有 个水滴。
接下来 行,每行两个正整数 ,表示在第 行 列放入一个水滴。
输出格式
输出到标准输出。
输出 加若干行。
前 行每行一个整数,第 行表示在第 次操作后扩散的水滴数。若没有扩散输出 。
最后若干行(可能是 行)表示棋盘上水滴的分布情况。由上至下,由左至右输出,每行三个正整数表示行号、列号、水滴数。
4 4 12 1
1 2 1
1 3 2
2 1 1
2 4 1
3 1 1
3 4 1
4 2 1
4 3 1
2 2 4
2 3 4
3 2 4
3 3 3
2 2
4
1 2 3
1 3 4
2 1 3
2 4 2
3 1 3
3 4 2
4 2 2
4 3 2
样例 1 解释
整个过程从上到下、从左到右表示。
字母表示该格子即将发射水滴的方向(U
:上, D
:下, L
:左, R
:右)。
黄色格子表示即将发射水滴的格子。
子任务
对于所有数据,保证:
- $1\le n,m\le 351493,~1\le c \le 750000,~1\le T\le 500000$;
- $1\le x_i,u_i\le n,~1\le y_i,v_i\le m,~1\le a_i\le 4$;
- 初始棋盘的水滴没有重复的 ,玩家操作过程中 处一定有水滴。
本题采用捆绑测试,你只有通过一个子任务中的所有测试点才能得到该子任务的分数。
- 子任务 1(17 分):保证 。
- 子任务 2(24 分):保证 。
- 子任务 3(24 分):保证 。
- 子任务 4(35 分):无特殊性质。
提示
由于数据规模较大,输入输出规模可达上百万个整数,请务必使用快速的方式进行输入输出。
此外,请使用一些方法尽可能优化时间常数,包括但不限于:
- 在递归模拟的过程中尽可能修改全局数组和全局变量,递归函数返回类型设为
void
,减少堆栈消耗空间; - 对数据范围分治,不同子任务使用不同的解法,例如对于子任务 1 和 2 可以直接使用常数更小的做法。
- 在同时间复杂度的做法中选取使用时间和空间常数均更小的做法。
Related
In following contests: