hdu1892(二维树状数组)
1 #include<iostream> 2 using namespace std; 3 int a[1010][1010],c[1010][1010],n=1005; 4 int lowbit(int x) 5 { 6 return x&(-x); 7 } 8 int sum(int x,int y) 9 { 10 int i,j,sum=0; 11 for(i=x;i>0;i-=lowbit(i)) 12 { 13 for(j=y;j>0;j-=lowbit(j)) 14 { 15 sum+=c[i][j]; 16 } 17 } 18 return sum; 19 } 20 void inster(int x,int y,int z) 21 { 22 int i,j; 23 for(i=x;i<=n;i+=lowbit(i)) 24 { 25 for(j=y;j<=n;j+=lowbit(j)) 26 { 27 c[i][j]+=z; 28 } 29 } 30 } 31 int main() 32 { 33 int x1,y1,x2,y2,t,m,i,j,n1,f=0; 34 scanf("%d",&t); 35 while(t--) 36 { 37 printf("Case %d:\n",++f); 38 memset(a,0,sizeof(a)); 39 memset(c,0,sizeof(c)); 40 for(i=1;i<=n;i++) 41 for(j=1;j<=n;j++) 42 { 43 a[i][j]=1; 44 inster(i,j,1); 45 } 46 scanf("%d",&m); 47 while(m--) 48 { 49 char s; 50 getchar(); 51 s=getchar(); 52 if(s=='S') 53 { 54 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 55 x1++;x2++;y1++;y2++; 56 if(x1>x2) 57 swap(x1,x2); 58 if(y1>y2) 59 swap(y1,y2); 60 printf("%d\n",sum(x2,y2)-sum(x2,y1-1)-sum(x1-1,y2)+sum(x1-1,y1-1)); 61 } 62 else 63 if(s=='A') 64 { 65 scanf("%d%d%d",&x1,&y1,&n1); 66 x1++;y1++; 67 inster(x1,y1,n1); 68 a[x1][y1]+=n1; 69 } 70 else 71 if(s=='D') 72 { 73 scanf("%d%d%d",&x1,&y1,&n1); 74 x1++;y1++; 75 if(n1>a[x1][y1]) 76 n1=a[x1][y1]; 77 inster(x1,y1,-n1); 78 a[x1][y1]-=n1; 79 } 80 else 81 if(s=='M') 82 { 83 scanf("%d %d %d %d %d",&x1,&y1,&x2,&y2,&n1); 84 x1++;y1++;x2++;y2++; 85 if(a[x1][y1]>=n1) 86 { 87 a[x1][y1]-=n1; 88 inster(x1,y1,-n1); 89 inster(x2,y2,n1); 90 a[x2][y2]+=n1; 91 } 92 else 93 { 94 inster(x1,y1,-a[x1][y1]); 95 inster(x2,y2,a[x1][y1]); 96 a[x2][y2]+=a[x1][y1]; 97 a[x1][y1]=0; 98 } 99 } 100 } 101 102 } 103 return 0; 104 } 105
http://acm.hdu.edu.cn/showproblem.php?pid=1892
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。