zoukankan      html  css  js  c++  java
  • P1789 【Mc生存】插火把

    题目背景

    初一党应该都知道......

    题目描述

    话说有一天linyorson在Mc开了一个超平坦世界,他把这个世界看成一个n*n的方阵,现在他有m个火把和k个萤石,分别放在x1,y1...xm,ym和o1,p1...ok,pk的位置,问在这个方阵中有几个点会生成怪物?(没有光或没放东西的地方会生成怪物)

    P.S.火把的照亮范围是:

    |暗|暗| 光 |暗|暗|
    |暗|光| 光 |光|暗|
    |光|光|火把|光|光|
    |暗|光| 光 |光|暗|
    |暗|暗| 光 |暗|暗|

    萤石:

    |光|光| 光 |光|光|
    |光|光| 光 |光|光|
    |光|光|萤石|光|光|
    |光|光| 光 |光|光|

    |光|光| 光 |光|光|

    输入输出格式

    输入格式:

    输入共m+k+1行。

    第一行为n,m,k。

    第2到第m+1行分别是火把的位置xi yi。

    第m+2到第m+k+1行分别是萤石的位置oi pi。

    注:可能没有萤石,但一定有火把。

    所有数据保证在int范围内。

    输出格式:

    有几个点会生出怪物。

    输入输出样例

    输入样例#1:
    5 1 0
    3 3
    输出样例#1:
    12

    #include<iostream>
    #include<cstdio>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    #define LL long long 
    int map[6000][6000];
    int n,m,k;
    int L,R,T,B;
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);
        for(int kk=1,x,y;kk<=m;kk++)
        {
            scanf("%d%d",&x,&y);
            int l=x-2,r=x+2;
            int i=0;
             for( i=0;l<=x;l++,i++)
            {
                L=max(1,l);R=min(n,r);
                T=min(y+i,n);B=max(y-i,1);            
                map[L][B]+=1;
                if(B!=T)
                    map[L][T]+=1;
            }
            l--,i=2;
            for(;l<=R;l++,i--)
            {
                L=max(1,l);R=min(n,r);
                T=min(y+i,n);B=max(y-i,1);
                map[L+1][B]-=1;
                if(B!=T)
                    map[L+1][T]-=1;
            }
        }
        
        for(int i=1,x,y;i<=k;i++)
        {
            scanf("%d%d",&x,&y);
            L=max(x-2,1);R=min(n,x+2);
            T=min(y+2,n);B=max(y-2,1);
            for(;B<=T;B++)
                map[L][B]+=1;
            B=max(y-2,1);
            for(;B<=T;B++)
                map[R+1][B]-=1;
        }
        int all=0;
        for(int j=1;j<=n;j++)
        {
            int tot=0;
            for(int i=1;i<=n;i++)
            {
                tot+=map[i][j];
                if(tot>0)    all++;
            }
        }    
        cout<<(n*n-all);
        return 0;
    }
  • 相关阅读:
    【模板】并查集
    P1063能量项链
    多维动归第一题
    7.14测试
    7.12测试
    7.10测试
    几种display:table-cell的应用
    instanceof和typeof的区别
    右侧悬浮广告
    JavaScript判断浏览器类型及版本
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7340400.html
Copyright © 2011-2022 走看看