hdu_5536_多校联赛4_1010

啊啊啊,简直要崩溃,题意是说有很多大水滴,当大水滴尺寸>=5时,会分裂成四个小水滴,然后向上下左右四个方向射去,当碰到另一个大水滴时就会融合到里面去,问你T时刻的状态。

思路极为简单的模拟,只需要模拟小水滴的状态就行,但是当时比赛现场管理员有很多误导,导致很多人不能够正确理解题意,首先,R为X的范围,C为Y的范围,admin直接说反,爆WA,其次,当大水滴分裂之后,原地点的状态表述不明,既然SIZE为0,那么以后由小水滴凝聚的时候会不会再次融合,这个地方就需要枚举题意,差评。

最后,放速度更快代码以示嘲讽,勿喷。

偶对,再放一组神数据

94 98 7 200

30 21 4

18 4 4

18 46 3

36 21 3

11 5 4

30 5 3

18 21 4

22 5

ANS:

0 46

0 75

0 117

0 76

0 11

0 30

0 58

#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int dx[4] = { 0, 1, 0, -1 };
const int dy[4] = { 1, 0, -1, 0 };
struct point{
    int x,y;
    int size;
}a[105];
struct yu{
    int x,y;
    int dir;
};
struct map{
    int size;
    int time;
}m[105][105];
int main(){
    freopen("in.txt","r",stdin);
    queue <yu> q2;
    queue <yu> q1;
    int r,c,n,t;
    int x,y;
    yu tmp,tt;
    while(~scanf("%d%d%d%d",&r,&c,&n,&t)){
        memset(m,0,sizeof(m));
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].size);
            m[a[i].x][a[i].y].size=a[i].size;
        }
        scanf("%d%d",&x,&y);
        for(int i=0;i<=3;i++){
            if(x+dx[i]<=r&&x+dx[i]>0&&y+dy[i]<=c&&y+dy[i]>0){
                tmp.x=x;
                tmp.y=y;
                tmp.dir=i;
                q1.push(tmp);
            }
        }
        for(int i=1;i<=t;i++){
            while(1){
                if(i%2){
                    if(q1.empty()) break;
                    tmp=q1.front();
                    q1.pop();
                }
                else{
                    if(q2.empty()) break;
                    tmp=q2.front();
                    q2.pop();
                }
                x=tmp.x+dx[tmp.dir];
                y=tmp.y+dy[tmp.dir];
                if(!(x<=r&&x>0&&y<=c&&y>0)) continue;
                tt.x=x;
                tt.y=y;
                tt.dir=tmp.dir;
                if(m[x][y].size) m[x][y].size++;
                else {
                    if(i%2) q2.push(tt);
                    else q1.push(tt);
                }
            }
            for(int j=1;j<=n;j++)
                if(m[a[j].x][a[j].y].size>=5){
                    m[a[j].x][a[j].y].time=i;
                    m[a[j].x][a[j].y].size=0;
                    for(int jj=0;jj<=3;jj++)
                        if(a[j].x+dx[jj]<=r&&a[j].x+dx[jj]>0&&a[j].y+dy[jj]<=c&&a[j].y+dy[jj]>0){
                            tmp.x=a[j].x;
                            tmp.y=a[j].y;
                            tmp.dir=jj;
                            if(i%2) q2.push(tmp);
                            else q1.push(tmp);
                        }
                }
        }
        for(int i=1;i<=n;i++){
            if(m[a[i].x][a[i].y].time>0) printf("0 %d\n",m[a[i].x][a[i].y].time);
            else printf("1 %d\n",m[a[i].x][a[i].y].size);
        }
        while(!q1.empty()) q1.pop();
        while(!q2.empty()) q2.pop();
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-03 23:31:49

hdu_5536_多校联赛4_1010的相关文章

2015 HDU 多校联赛 5317 RGCDQ 筛法求解

2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目  http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据量大, 所以必须做预处理.也就是用筛法求出全部的F[x],将全部F[x] 打印出来发现.事实上结果不大,最大的数值是7.所以对于每一个区间询问, 直接暴力求取有多少个 1 2 3 4 5 6 7 就可以,从大到小查找.假设出现2个以上 3-7 的数值,那么最大公约数就是该数字. 假设没有出现两个反复

2015 HDU 多校联赛 5326 Work

2015 HDU 多校联赛 5326 Work 题目: http://acm.hdu.edu.cn/showproblem.php?pid=5326 这题应该是本周二多校赛中,最简单的一道题目了. 解题思路: 就是回根. 用一个数组 root[i] = j 表示 i 的上级是 j , 对于每个输入的关系都做这样的处理.然后遍历每个编号直到root[i] 的结果为0 (因为根没有上级,所以根为0),在往根回退的过程中,用一个数组 cnt[i] 表示经过i这个点的次数. 最后就是遍历 cnt[i],

[2015hdu多校联赛补题]hdu5371 Hotaru&#39;s problem

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5371 题意:把一个数字串A翻过来(abc翻过来为cba)的操作为-A,我们称A-AA这样的串为N-sequence,现在给你一个数字串,问你这个串中最长的N-sequence子串长度 解:可以想到A-A是一个回文串,-AA也是一个回文串,那么首先Manacher跑一遍求出所有回文子串 可以想到任意两个互相覆盖的回文子串都可以表示成N-sequence 然后有三种搞法: 1.时间复杂度O(N*logN

2015 HDU 多校联赛 5363 Key Set

2015 HDU 多校联赛 5363 Key Set 题目: http://acm.hdu.edu.cn/showproblem.php?pid=5363 根据前面给出的例子,得出求解公式 fn = 2^(n-1) - 1, 数据量大,实际就是求幂次方. 可用分治法求解,复杂度O(nlogn) // 分治法求快速幂 #include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; const int MO

[2015hdu多校联赛补题]hdu5348 MZL&#39;s endless loop

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348 题意:给你一个无向图,要你将无向图的边变成有向边,使得得到的图,出度和入度差的绝对值小于等于1,如果无解输出-1 解:考虑奇数度的点一定会成对出现(因为所有度数和肯定是偶数个->因为一条边产生两度~),那么我们可以将奇数度的点两两一连消除掉(两奇数度点的出度入读差的绝对值都为1, 路径上的点的差绝对值为0) 然后偶数度的点可以成环,那么可以搜出所有的环 1 /* 2 * Problem: 3

hdu 5344 (多校联赛) MZL&#39;s xor --- 位运算

here:    首先看一下题吧:题意就是让你把一个序列里所有的(Ai+Aj) 的异或求出来.(1<=i,j<=n) Problem Description MZL loves xor very much.Now he gets an array A.The length of A is n.He wants to know the xor of all (Ai+Aj)(1≤i,j≤n) The xor of an array B is defined as B1 xor B2...xor B

[2015hdu多校联赛补题]hdu5378 Leader in Tree Land

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5378 题意:给你一棵n个结点的有根树.因为是有根树,那么每个结点可以指定以它为根的子树(后面讨论的子树都是这个).现在我们把标号从1到n的n个minister派驻到这些结点上面(每个结点派驻一人),并规定任一子树中编号最大的minister 为该子树的领导,问你存在多少个不同的领导 解: 引用官方题解: 可以用求概率的思想来解决这个问题.令以i号节点为根的子树为第i棵子树,设这颗子树恰好有sz[i]

[2015hdu多校联赛补题]hdu5372 Segment Game

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5372 题意:进行n次操作,操作分两种,0和1,每一个0操作按出现顺序有一个编号(从1开始 0操作 0 x:询问[x, x+i](i为该操作的编号)区间内有多少个完整的线段,并加入线段[x, x+i](线段直接重叠不影响) 1操作 1 x:删除0操作中插入的编号为x的线段,(不影响其他线段,不会重复删除同一线段,删除的线段一定是已经插入的) 解:题目有一个重要的条件:后面插入的线段一定比前面的长.那么

hdu_5551_多校联赛5_1009

把表打出来一部分,轻松找到规律即可. import java.util.Scanner; import java.math.BigInteger; import java.math.BigDecimal; public class Main{ public static void main(String []args){ Scanner cin=new Scanner(System.in); int t; BigInteger a[]=new BigInteger[1011]; a[1]=Big