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

#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;
}

 

posted @ 2018-11-01 21:05  BIack_Cat  阅读(151)  评论(0编辑  收藏  举报