• 18牛客第二场 J farm


    链接:https://www.nowcoder.com/acm/contest/140/J
    来源:牛客网

    White Rabbit has a rectangular farmland of n*m. In each of the grid there is a kind of plant. The plant in the j-th column of the i-th row belongs the a[i][j]-th type. White Cloud wants to help White Rabbit fertilize plants, but the i-th plant can only adapt to the i-th fertilizer. If the j-th fertilizer is applied to the i-th plant (i!=j), the plant will immediately die. Now White Cloud plans to apply fertilizers T times. In the i-th plan, White Cloud will use k[i]-th fertilizer to fertilize all the plants in a rectangle [x1[i]...x2[i]][y1[i]...y2[i]]. White rabbits wants to know how many plants would eventually die if they were to be fertilized according to the expected schedule of White Cloud.
    输入描述:
    The first line of input contains 3 integers n,m,T(n*m<=1000000,T<=1000000)For the next n lines, each line contains m integers in range[1,n*m] denoting the type of plant in each grid.For the next T lines, the i-th line contains 5 integers x1,y1,x2,y2,k(1<=x1<=x2<=n,1<=y1<=y2<=m,1<=k<=n*m)
    输出描述:
    Print an integer, denoting the number of plants which would die.

    示例1

    输入

    2 2 2
    1 2
    2 3
    1 1 2 2 2
    2 1 2 1 1

    输出

    3

    题意:给出一个n*m的区域,t次操作 每个点都是一种植物 t次操作区域覆盖肥料,如果区域里面的植物不等于覆盖的飞亮那么就植物死亡,求有多少植物死亡。

    思路:我们将每种植物的坐标存下来,然后我也将每种肥料的覆盖区域坐标存下,在我们算每种植物贡献的时候,我们先删除同种肥料对于贡献的影响,然后再查询完再加上

    最后枚举所有植物即可。

    #include<bits/stdc++.h>
    using namespace std;
    #define pb push_back
    #define pll pair<int,int>
    #define mp make_pair
    #define ll long long
    const int maxn = 1000000+5;
    struct node
    {
        int x1,x2,y1,y2;
        node(int x1,int x2,int y1,int y2):x1(x1),x2(x2),y1(y1),y2(y2) {};
    };
    vector< vector< pll > > p;
    vector< vector< int > > a;
    vector< vector<node> > pos;
    int n,m;
    int lowbit(int x)
    {
        return x&(-x);
    }
    void add(int x,int y,int d)
    {
    
        for(int i=x; i<=n; i+=lowbit(i))
            for(int j=y; j<=m; j+=lowbit(j))
                a[i][j]+=d;
    }
    int query(int x,int y)
    {
        int ans=0;
        for(int i=x; i>0; i-=lowbit(i))
            for(int j=y; j>0; j-=lowbit(j))
                ans+=a[i][j];
        return ans;
    
    }
    void updata(int x1,int y1,int x2,int y2,int d)
    {
        add(x1,y1,d);
        add(x2+1,y2+1,d);
        add(x1,y2+1,-d);
        add(x2+1,y1,-d);
    }
    int main()
    {
        int t,k,x1,x2,y1,y2;
        scanf("%d %d %d",&n,&m,&t);
        a.resize(n+1);
        for(int i=1; i<=n; i++)
            a[i].resize(m+1);
        p.resize(n*m+1);
        pos.resize(n*m+1);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
            {
                scanf("%d",&k);
                p[k].pb(mp(i,j));
            }
        for(int i=1; i<=t; i++)
        {
            scanf("%d %d %d %d %d",&x1,&y1,&x2,&y2,&k);
            pos[k].pb(node(x1,x2,y1,y2));
            updata(x1,y1,x2,y2,1);
        }
        ll ans=0;
        for(int i=1; i<=n*m; i++)
        {
            int len=pos[i].size();
            for(int j=0; j<len; j++)
            {
                updata(pos[i][j].x1,pos[i][j].y1,pos[i][j].x2,pos[i][j].y2,-1);
            }
            int len1=p[i].size();
            for(int j=0; j<len1; j++)
            {
                if(query(p[i][j].first,p[i][j].second))
                    ans++;
            }
            for(int j=0; j<len; j++)
            {
                updata(pos[i][j].x1,pos[i][j].y1,pos[i][j].x2,pos[i][j].y2,1);
            }
    
        }
       printf("%lld
    ",ans);
    }
    View Code

    PS:摸鱼怪的博客分享,欢迎感谢各路大牛的指点~

  • 相关阅读:
    mysql权限设置
    linux修改文件所属用户和组
    修改solaris 用户密码默认8位长度
    解决Solaris /home目录下无法创建目录问题
    MySQL修改root密码的多种方法
    solaris 安装jdk
    iPhone ZBar库 中文乱码解决方法重新编译libzbar.a
    ios中调用WCF
    Android自动在线升级(服务器为Tomcat)
    String字符串讲解
  • 原文地址:https://www.cnblogs.com/MengX/p/9350639.html
Copyright © 2020-2023  润新知