【BZOJ1452】【JSOI2009】count
暴力出奇迹……
原题:
图片题面好评(图片样例差评
我最开始的思路:
容斥,变成每次询问((1,1),(x,y))这个矩阵中颜色为c的个数,然后三维偏序!cdq分治!
但是2e5的询问好像并不大丈夫?乘个4就变成8e5了
然后搜题解……woc原来还可以这么玩……
因为每次值查询一个值所以直接开100个树状数组xjb搞就行了,复杂度没问题
那么如果把询问减小,然后每次询问的是一个区间的值要怎么做呢嘿嘿嘿
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 int rd(){int z=0,mk=1; char ch=getchar(); 8 while(ch<'0'||ch>'9'){if(ch=='-')mk=-1; ch=getchar();} 9 while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0'; ch=getchar();} 10 return z*mk; 11 } 12 int n,m,quq,a[310][310]; 13 int e[110][310][310],lbt[310]; 14 void gtlbt(){ for(int i=1;i<=300;++i) lbt[i]=i&-i;} 15 void mdf(int x,int y,int z,int v){ 16 for(int i=x;i<=n;i+=lbt[i])for(int j=y;j<=m;j+=lbt[j]) 17 e[z][i][j]+=v; 18 } 19 int qr(int x,int y,int z){ 20 int bwl=0; 21 for(int i=x;i;i-=lbt[i])for(int j=y;j;j-=lbt[j]) 22 bwl+=e[z][i][j]; 23 return bwl; 24 } 25 int main(){//freopen("ddd.in","r",stdin); 26 //freopen("ddd.out","w",stdout); 27 gtlbt(); 28 cin>>n>>m; 29 for(int i=1;i<=n;++i)for(int j=1;j<=m;++j) 30 mdf(i,j,a[i][j]=rd(),1); 31 int mk,x1,y1,x2,y2,v,bwl=0; 32 cin>>quq; 33 while(quq--){ 34 mk=rd(); 35 if(mk==1){ 36 x1=rd(),y1=rd(),v=rd(); 37 mdf(x1,y1,a[x1][y1],-1),mdf(x1,y1,a[x1][y1]=v,1); 38 } 39 else{ 40 x1=rd(),x2=rd(),y1=rd(),y2=rd(),v=rd(); 41 bwl=qr(x1-1,y1-1,v)+qr(x2,y2,v); 42 bwl-=qr(x1-1,y2,v)+qr(x2,y1-1,v); 43 printf("%d\n",bwl); 44 } 45 } 46 return 0; 47 }