Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 14391 | Accepted: 6685 |
Description
Input
Output
Sample Input
0 4 1 1 2 3 2 0 0 2 2 1 1 1 2 1 1 2 -1 2 1 1 2 3 3
Sample Output
3 4
Source
1 #include <iostream>
2 #include <stdio.h>
3 #include <string.h>
4 using namespace std; 5
6 #define MAXN 1100
7
8 int tree[MAXN*3][MAXN*3],s; 9
10 void Add_y(int d,int dy,int L,int R,int y,int a) //加数列操作
11 { 12 tree[d][dy] += a; //相关矩阵全部加a
13
14 if(L==R){ 15 return ; 16 } 17
18 int mid = (L+R)>>1; 19 if(mid>=y) 20 Add_y(d,dy<<1,L,mid,y,a); 21 else
22 Add_y(d,dy<<1|1,mid+1,R,y,a); 23 } 24
25 void Add_x(int d,int L,int R,int x,int y,int a) //加数行操作
26 { 27 Add_y(d,1,1,s,y,a); //每一个行块都要更新其对应的列块,这样才能将所有与(x,y)相关的矩阵的值更新
28
29 if(L==R){ 30 return ; 31 } 32
33 int mid = (L+R)>>1; 34 if(mid>=x) 35 Add_x(d<<1,L,mid,x,y,a); 36 else
37 Add_x(d<<1|1,mid+1,R,x,y,a); 38 } 39
40
41 int Sum_y(int d,int dy,int L,int R,int b,int t) 42 { 43 if(L==b && R==t) //找到要找的矩阵,输出这个矩阵对应的值
44 return tree[d][dy]; 45
46 //没找到
47 int mid = (L+R)>>1; 48 if(mid >= t) 49 return Sum_y(d,dy<<1,L,mid,b,t); 50 else if(mid < b) 51 return Sum_y(d,dy<<1|1,mid+1,R,b,t); 52 else
53 return Sum_y(d,dy<<1,L,mid,b,mid) + Sum_y(d,dy<<1|1,mid+1,R,mid+1,t); 54 } 55
56 int Sum_x(int d,int L,int R,int l,int r,int b,int t) 57 { 58 if(L==l && R==r){ //找到要找的行块,继续查找列块
59 return Sum_y(d,1,1,s,b,t); 60 } 61
62 //没找到
63 int mid = (L+R)>>1; 64 if(mid >= r) 65 return Sum_x(d<<1,L,mid,l,r,b,t); 66 else if(mid < l) 67 return Sum_x(d<<1|1,mid+1,R,l,r,b,t); 68 else
69 return Sum_x(d<<1,L,mid,l,mid,b,t) + Sum_x(d<<1|1,mid+1,R,mid+1,r,b,t); 70 } 71
72 int main() 73 { 74 int cmd,x,y,a,l,r,b,t; 75
76 while(scanf("%d",&cmd)!=EOF){ 77 switch(cmd){ 78 case 0: //初始化矩阵
79 scanf("%d",&s); 80 memset(tree,0,sizeof(tree)); 81 break; 82
83 case 1: //加数
84 scanf("%d%d%d",&x,&y,&a); 85 Add_x(1,1,s,x+1,y+1,a); 86 break; 87
88 case 2: //求矩阵和
89 scanf("%d%d%d%d",&l,&b,&r,&t); 90 printf("%d\n",Sum_x(1,1,s,l+1,r+1,b+1,t+1)); 91 break; 92
93 case 3: //退出程序
94 return 0; 95 default: 96 break; 97 } 98 } 99 return 0; 100 }
Freecode : www.cnblogs.com/yym2013