首页 > 编程语言 > 详细

牛客网暑期ACM多校训练营(第二场)J farm 二维差分数组+随机化

时间:2018-11-01 21:34:40      阅读:196      评论:0      收藏:0      [点我收藏+]
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const LL mod=1e9+7;
const int maxn=1e6+10;
#define lowbit(x) (x&(-x))
struct BIT
{
    LL**a;int n,m;
    BIT(){a=0;n=m=-1;}
    BIT(int n,int m):n(n),m(m)
    {
        a=new LL*[n+1];
        for(int i=0;i<=n;i++)a[i]=new LL[m+1]();
    }
    ~BIT(){
        for(int i=0;i<=n;i++) free(a[i]);
        if(a!=0)free(a);
    }
    void add(int x,int y,int v)
    {
         if(x<=n&&x>=1&&y<=m&&y>=1)
         a[x][y]+=v;
    }
    void sum()
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
    }
};
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
    while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
    return x*f;
}
int main()
{
#ifdef shuaishuai
    freopen("in.txt","r",stdin);
#endif // shuaishuai
 
    int n,m,k;
    scanf("%d%d%d",&n,&m,&k);
    BIT t(n,m);
    vector<int>id(n*m+1);
    srand(time(NULL));
    for(int i=1,sz=n*m;i<=sz;i++)
    {
        id[i]=1000007+rand()*rand()+rand();
    }
    vector<int>a[n+1];
     for(int i=1;i<=n;i++)
    {
        a[i].resize(m+1);
        for(int j=1;j<=m;j++)
           a[i][j]=id[read()];
    }
    while(k--)
    {
        int x1,y1,x2,y2,v;
        x1=read(),y1=read(),x2=read(),y2=read(),v=id[read()];
        t.add(x1,y1,v);t.add(x2+1,y1,-v);t.add(x1,y2+1,-v);t.add(x2+1,y2+1,v);
    }
    t.sum();
    int ans=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
    {//判断是否会死的关键是对于该点施肥种类的累计和应被该花对应化肥种类值整除 所以随机1e6以上的数能高概率不能整除
        if(t.a[i][j]%a[i][j]!=0)ans++;
    }
    printf("%d\n",ans);
    return 0;
}

 

牛客网暑期ACM多校训练营(第二场)J farm 二维差分数组+随机化

原文:https://www.cnblogs.com/polya/p/9892518.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!