HDu 1892(2 Dツリー配列)
14823 ワード
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:
",++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
",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