二维树状数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 |
#include <cstdio> #include <algorithm> using
namespace std; #define N 1005 int c[N][N]; int i,j,n,num,p,T,cnt=1; int sum( int
x, int y){ int
i,j,tmp=0; for (i=x;i>0;i-=(i&-i)) for (j=y;j>0;j-=(j&-j)) tmp+=c[i][j]; return
tmp; } void
add( int
x, int y, int num){ for ( int
i=x;i<N;i+=(i&-i)) for ( int
j=y;j<N;j+=(j&-j)) c[i][j]+=num; } void
init(){ for ( int
i=1;i<N;i++) for ( int
j=1;j<N;j++)c[i][j]=0; for ( int
i=1;i<N;i++) for ( int
j=1;j<N;j++)add(i,j,1); } void
scan( int
&x){ char
c; while (c= getchar (),c> ‘9‘ ||c< ‘0‘ );x=c- ‘0‘ ; while (c= getchar (),c<= ‘9‘ &&c>= ‘0‘ )x=x*10+c- ‘0‘ ; } int
main(){ char
s[10]; char
c1,c2; int
y1,y2,x1,x2; scanf ( "%d" ,&T); while (T--){ scanf ( "%d" ,&n); init(); printf ( "Case %d:\n" ,cnt++); while (n--){ c1= getchar (); if (c1== ‘A‘ ){ scan(x1),scan(y1),scan(num); add(x1+1,y1+1,num); } else
if (c1== ‘S‘ ){ scan(x1),scan(y1),scan(x2),scan(y2); if (x1<x2) swap(x1,x2); if (y1<y2) swap(y1,y2); printf ( "%d\n" ,sum(x1+1,y1+1)-sum(x1+1,y2)-sum(x2,y1+1)+sum(x2,y2)); } else
if (c1== ‘D‘ ){ scan(x1),scan(y1),scan(num); p=sum(x1+1,y1+1)-sum(x1,y1+1)-sum(x1+1,y1)+sum(x1,y1); num=p<num?p:num; add(x1+1,y1+1,-num); } else
if (c1== ‘M‘ ){ scan(x1),scan(y1),scan(x2),scan(y2),scan(num); p=sum(x1+1,y1+1)-sum(x1,y1+1)-sum(x1+1,y1)+sum(x1,y1); num=num<p?num:p; add(x1+1,y1+1,-num); add(x2+1,y2+1,num); } else
n++; } } return
0; } |
原文:http://www.cnblogs.com/forever97/p/3562500.html