题意:给出r*c区域,每滴水的位置和初始容量,一开始在某点爆开一滴水,向四个方向发射一个容量为1的小水滴,其他水滴能接受这滴水并增加容量1,容量大于4时爆裂,重复上述过程,问时间t后每滴水的状态。
范围:水滴不超过100,时间不超过10000
思路一:模拟每滴水滴爆裂后的小水滴,模拟每个时刻棋盘上的状态,复杂度超过400W。(样例数有100,不太好,很容易超时)
思路二:建立以时间为key的优先队列,用 “事件” 发生的早晚来模拟求得此刻状态,可知每一滴小水滴最多发生100个事件,故而队列中最多20000个事件,复杂度log(2W)*2W. (15ms秒过)
题意二:题解中提出,n可达到10的5次,t可达到10的9次,r,c小于等于10的5次 , 其他如上。
思路:类似思路二,建立十字链表或者10W个map之类的模拟棋盘,每一滴小水滴不再是扫描整行或整列来加入事件,而是得到最近的四个方向的大水滴,则枚举到此事件时有2种情况:①大水滴被其他水滴消灭,则此小水滴继续推一格,(在棋盘中可能对应很多格),此事件弹出,(若有下一格)重新计算时间构成新事件加入队列 ②大水滴还在,加入大水滴即可,此事件弹出。 可知,队列中最多有10W*2个事件同时存在,每个时刻必定有一个或多个大水滴消灭,同一时刻的事件发生数量应该不多,设其均摊到每个水滴为K,则时间复杂度为 log(20W)*10W*K (可以预计K很小,均摊下来应该不超过4,因为实际发生40W++事件,并且实际复杂度应该小得多)
原题代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<iostream>
#include<stdlib.h>
#include<set>
#include<map>
#include<queue>
#include

该博客讨论了HDU-5336 XYZ and Drops问题的解决策略,主要涉及模拟水滴在r*c区域内的爆裂传播。博主提出了两种模拟方法,第一种直接模拟每滴水的状态,但由于复杂度过高可能导致超时;第二种使用优先队列以事件发生的时间顺序进行模拟,复杂度降低到可以接受的程度。在后续的优化中,考虑到更大的规模问题,博主提出了十字链表或地图映射的解决方案,通过优化事件处理,降低了时间复杂度。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



