牛客网暑期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; }