Problem Description
XYZ is playing an interesting game called "drops". It is played on a r∗c grid. Each grid cell is either empty, or occupied by a waterdrop. Each waterdrop has a property "size". The waterdrop cracks when its size is larger than 4, and produces 4 small drops moving towards 4 different directions (up, down, left and right).

In every second, every small drop moves to the next cell of its direction. It is possible that multiple small drops can be at same cell, and they won't collide. Then for each cell occupied by a waterdrop, the waterdrop's size increases by the number of the small drops in this cell, and these small drops disappears.

You are given a game and a position (x, y), before the first second there is a waterdrop cracking at position (x, y). XYZ wants to know each waterdrop's status after T seconds, can you help him?

1≤r≤100, 1≤c≤100, 1≤n≤100, 1≤T≤10000

 
Input
The first line contains four integers r, c, n and T. n stands for the numbers of waterdrops at the beginning. 
Each line of the following n lines contains three integers xi, yi, sizei, meaning that the i-th waterdrop is at position (xi, yi) and its size is sizei. (1≤sizei≤4)
The next line contains two integers x, y.

It is guaranteed that all the positions in the input are distinct.

Multiple test cases (about 100 cases), please read until EOF (End Of File).

 
Output
n lines. Each line contains two integers Ai, Bi: 
If the i-th waterdrop cracks in T seconds, Ai=0, Bi= the time when it cracked. 
If the i-th waterdrop doesn't crack in T seconds, Ai=1, Bi= its size after T seconds.
 
Sample Input
4 4 5 10
2 1 4
2 3 3
2 4 4
3 1 2
4 3 4
4 4
 
Sample Output
0 5
0 3
0 2
1 3
0 1
 

题意:

在一个 r*c 的格子图上,有 n 个水滴静止。每当水滴体积超过 4 时,会分成 4 个体积为 1 的小水滴向上下左右四个方向运动,每秒移动一个格子。小水滴与静止的水滴碰撞后会合成,体积相加。开始时 n 个水滴都静止,给出一个在 (x,y) 位置炸开的水滴作为启动源。

注意:1.小水滴彼此间不影响,即使同时经过同一位置。

2.若多个小水滴同时到达同一格子,则都与位于该格子的水滴合体,体积相加。超过 4 后按上述规则分裂。(即使为6,7等等)

思路:

因为数据较小所以直接暴力模拟O(nT)也能过。。

笔者用优先队列维护最先受到影响的水滴,依次处理,直到时间超出 T 或者是优先队列为空,则终止。

刚开始没有注意到应该注意的两点各种跪。。

水滴的结构体中还有一个变量 dir 记录该影响移动的方向。因为存在到了该“影响”发生的时候原有位置的水滴已经分裂不存在的情况,此时应继续向该方向搜索离之最近的点。

感觉实现的时候还是比较多细节要注意的。

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
#define mod 1005
const int U=,D=,L=,R=;
int r,c,n,t,x,y;
struct drop{
int x,y,size,status,time,num,dir;
bool operator < (const drop d) const{
return time>d.time;
}
}drops[];
int update(int num,int dir){
int closest=-;
for(int i=;i<n;i++) if(drops[i].status&&i!=num){
if(dir==U){
if(drops[num].x==drops[i].x&&drops[num].y<drops[i].y)
if(closest==-||drops[i].y<drops[closest].y) closest=i;
}
else if(dir==D){
if(drops[num].x==drops[i].x&&drops[num].y>drops[i].y)
if(closest==-||drops[i].y>drops[closest].y) closest=i;
}
else if(dir==L){
if(drops[num].y==drops[i].y&&drops[num].x>drops[i].x)
if(closest==-||drops[i].x>drops[closest].x) closest=i;
}
else{
if(drops[num].y==drops[i].y&&drops[num].x<drops[i].x)
if(closest==-||drops[i].x<drops[closest].x) closest=i;
}
}
return closest;
}
priority_queue<drop>pq;
vector<drop> T;
int main(){
for(int i=;i<;i++) drops[i].num=i;
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(~scanf("%d%d%d%d",&r,&c,&n,&t)){
for(int i=;i<n;i++){
scanf("%d%d%d",&drops[i].x,&drops[i].y,&drops[i].size);
drops[i].status=,drops[i].time=;
}
scanf("%d%d",&x,&y);
while(!pq.empty()) pq.pop();
drops[].x=x,drops[].y=y,drops[].status=;
drops[].size=,drops[].time=;
pq.push(drops[]);
int t_now=;
while(!pq.empty()){
drop tmp=pq.top();
while(!drops[tmp.num].status){
pq.pop();
int num=update(tmp.num,tmp.dir);
if(num!=-){
drop temp=drops[num];
temp.dir=tmp.dir;
if(temp.dir==U) temp.time=temp.y-tmp.y;
else if(temp.dir==D) temp.time=tmp.y-temp.y;
else if(temp.dir==L) temp.time=tmp.x-temp.x;
else temp.time=temp.x-tmp.x;
temp.time+=tmp.time;
pq.push(temp);
}
if(pq.empty()) break;
else tmp=pq.top();
}
if(pq.empty()) break;
if(tmp.time>t) break;
int up=-,down=-,left=-,righ=-;
if(drops[tmp.num].size<){
drops[tmp.num].size++;
pq.pop();
continue;
}
pq.pop();//new
T.clear();
while(!pq.empty()){
drop Tmp=pq.top();
if(Tmp.time==tmp.time&&Tmp.x==tmp.x&&Tmp.y==tmp.y)
pq.pop();
else if(Tmp.time==tmp.time){
T.push_back(Tmp);
pq.pop();
}
else break;
}
for(int i=;i<T.size();i++) pq.push(T[i]);
drops[tmp.num].status=;
drops[tmp.num].time=tmp.time;
t_now=drops[tmp.num].time;
for(int i=;i<n;i++) if(drops[i].status){
if(tmp.x==drops[i].x){
if(tmp.y<drops[i].y){
if(up==-||drops[i].y<drops[up].y) up=i;
}
else{
if(down==-||drops[i].y>drops[down].y) down=i;
}
}
else if(tmp.y==drops[i].y){
if(tmp.x>drops[i].x){
if(left==-||drops[i].x>drops[left].x) left=i;
}
else{
if(righ==-||drops[i].x<drops[righ].x) righ=i;
}
}
}
if(up!=-&&drops[up].time>drops[up].y-tmp.y+t_now){
drop temp=drops[up];
temp.time=drops[up].y-tmp.y+t_now,temp.dir=U;
pq.push(temp);
}
if(down!=-){
drop temp=drops[down];
temp.time=tmp.y-drops[down].y+t_now,temp.dir=D;
pq.push(temp);
}
if(left!=-){
drop temp=drops[left];
temp.time=tmp.x-drops[left].x+t_now,temp.dir=L;
pq.push(temp);
}
if(righ!=-){
drop temp=drops[righ];
temp.time=drops[righ].x-tmp.x+t_now,temp.dir=R;
pq.push(temp);
}
//pq.pop();
}
for(int i=;i<n;i++){
if(drops[i].status) printf("1 %d\n",drops[i].size);
else printf("0 %d\n",drops[i].time);
}
}
return ;
}

2015 多校赛 第四场 1010 (hdu 5336)的更多相关文章

  1. 2015 多校赛 第五场 1010 (hdu 5352)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5352 看题看得心好累. 题目大意: 给出 n 个点,依次执行 m 次操作:输入“1 x”时,表示将与 ...

  2. 2015 多校赛 第四场 1009 (hdu 5335)

    Problem Description In an n∗m maze, the right-bottom corner is the exit (position (n,m) is the exit) ...

  3. 2015 多校赛 第七场 1011 (hdu 5379)

    题意:给定一棵树,树上有 n 个节点.问有多少种方案,使得在每个节点上依次放置数 1~n 后,每个节点的儿子节点上的数连续(比如 1 为根,有1-2,1-3,1-4,则令2,3,4上的数连续),每个子 ...

  4. 2015 多校赛 第五场 1006 (hdu 5348)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348 题目大意:给出一幅无向图,问是否存在一种方案,使得给每条边赋予方向后,每个点的入度与出度之差小于 ...

  5. 2015 多校赛 第三场 1002 (hdu 5317)

    Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more and more i ...

  6. hdu 5328 Problem Killer(杭电多校赛第四场)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5328 题目大意:找到连续的最长的等差数列or等比数列. 解题思路:1.等差等比的性质有很多.其中比较重 ...

  7. 【杂题总汇】HDU多校赛第十场 Videos

    [HDU2018多校赛第十场]Videos 最后一场比赛也结束了…… +HDU传送门+ ◇ 题目 <简要翻译> 有n个人以及m部电影,每个人都有一个快乐值.每场电影都有它的开始.结束时间和 ...

  8. NOI.AC NOIP模拟赛 第四场 补记

    NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...

  9. hdu5379||2015多校联合第7场1011 树形统计

    pid=5379">http://acm.hdu.edu.cn/showproblem.php? pid=5379 Problem Description Little sun is ...

随机推荐

  1. office 2016最新安装及激活教程(KMS)【亲测有效】!!

    前言 博主的一个朋友,咳咳--你们懂得,想装office,于是我就上网找了一下激活的方法,亲测有效,而且也没有什么广告病毒之类的,还比较方便,所以传上来方便大家.好了,进入正题: 安装office 首 ...

  2. SqlServer大数据的分区方案

    这里介绍的是大数据量的维护日志的分区解决方案: 每个月1张数据表,1个分组文件.31个分区(按每天1个分区).... 为了日后维护方便,直接删除旧的日志数据文件就可以,而不需要去做分区压缩. --用的 ...

  3. MySQL(端口3306)

    MySQL(二进制)安装: 下载地址:http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.49-linux2.6-x86_64.tar.gz ...

  4. 瑞芯微ROCK960 RK3399固件烧录总结

    1 下载固件 进入瑞芯微ROCK960下载主页 https://www.96boards.org/documentation/consumer/rock/downloads/ 选择os固件, Debi ...

  5. 利用WMITool解决浏览器快捷方式启动参数被篡改以及浏览器主页被劫持的问题

    先说说症状 症状①:通过快捷方式启动浏览器,首页跳转到2345以及hao123网址导航页,切系统内安装的多款浏览器(IE.Chrome.Firefox.Opera.Safari.Maxthon)症状相 ...

  6. Maven学习总结(9)——使用Nexus搭建Maven私服

    1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则,私服请求外部 ...

  7. centos7.0_redhat7.0安装vncserver和Desktop桌面

    http://blog.51cto.com/gushiren/1681616 https://blog.csdn.net/techsupporter/article/details/50628399

  8. 优化实例- not in 和 not exists

    客户运行一个SQL,非常慢.于是进行了一下改写.速度飞快,首先看一下原来的SQL. original sql SQL> explain plan for 2 select count(*) fr ...

  9. PHP array_intersect_assoc()

    定义和用法 array_intersect_assoc() 函数返回两个或多个数组的交集数组. 与 array_intersect() 函数 不同的是,本函数除了比较键值,还比较键名.返回的数组中元素 ...

  10. ipcs命令学习

    参考这篇 http://blog.csdn.net/pyjfoot/article/details/7989097 ipcs -m -s -q 分别对应集中ipc ipcs -l 显示limits: ...