POJ 1195 Mobile phones(二维树状数组)
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 15968 | Accepted: 7373 |
Description
Write a program, which receives these reports and answers queries about the current total number of active mobile phones in any rectangle-shaped area.
Input
The values will always be in range, so there is no need to check them. In particular, if A is negative, it can be assumed that it will not reduce the square value below zero. The indexing starts at 0, e.g. for a table of size 4 * 4, we have 0 <= X <= 3 and 0 <= Y <= 3.
Table size: 1 * 1 <= S * S <= 1024 * 1024
Cell value V at any time: 0 <= V <= 32767
Update amount: -32768 <= A <= 32767
No of instructions in input: 3 <= U <= 60002
Maximum number of phones in the whole table: M= 2^30
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
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<stdlib.h> using namespace std; const int maxn = 1025; int n,id; int c[maxn][maxn]; int lowbit(int x) { return x&(-x); } void updata(int i,int j,int k) { while(i<=n) { int pj = j; while(pj<=n) { c[i][pj] += k; pj += lowbit(pj); } i += lowbit(i); } } int getsum(int i,int j) { int sum = 0; while(i>0) { int pj = j; while(pj>0) { sum += c[i][pj]; pj -= lowbit(pj); } i -= lowbit(i); } return sum; } int main() { scanf("%d%d",&id,&n); int x,y,z,xx,yy; while(scanf("%d",&id)!=EOF) { if(id == 3) { break; } if(id == 1) { scanf("%d%d%d",&x,&y,&z); x++; y++; updata(x,y,z); } else if(id == 2) { scanf("%d%d%d%d",&x,&y,&xx,&yy); x++; y++; xx++; yy++; printf("%d\n",getsum(xx,yy)-getsum(x-1,yy) - getsum(xx,y-1) + getsum(x-1,y-1)); } } return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。