POJ - 1195 - Mobile phones
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ - 1195 - Mobile phones相关的知识,希望对你有一定的参考价值。
题目链接:POJ - 1195
题目大意:
初始化一个n*n的数组为0。
进行如下操作:
1.输入 A,B,K。
坐标(A,B)增加K。
2.数组A,B,C,D
求以(A,B)为左上点,
以(C,D)为右下点的矩阵的和。
题目分析:
二维树状数组,
其实类似于一维的,不过增加了一层循环。
给出代码:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 int N; 7 const int inf=1024+10; 8 int vis[inf+10][inf+10]; 9 int bit(int x) 10 { 11 return (x&(-x)); 12 } 13 int sum(int x,int y) 14 { 15 int s=0; 16 for(int i=x;i>0;i-=bit(i)) 17 { 18 for(int j=y;j>0;j-=bit(j)) 19 s+=vis[i][j]; 20 } 21 return s; 22 } 23 int add(int x,int y,int A) 24 { 25 for(int i=x;i<=N;i+=bit(i)) 26 for(int j=y;j<=N;j+=bit(j)) 27 vis[i][j]+=A; 28 } 29 int main() 30 { 31 int a; 32 while(cin>>a) 33 { 34 if(a==0) 35 { 36 scanf("%d",&N); 37 N=N+10; 38 } 39 if(a==3) 40 break; 41 if(a==1) 42 { 43 int x; 44 int y; 45 int k; 46 scanf("%d%d%d",&x,&y,&k); 47 add(x+1,y+1,k); 48 } 49 if(a==2) 50 { 51 int a,b,c,d; 52 scanf("%d%d%d%d",&a,&b,&c,&d); 53 a++; 54 b++; 55 c++; 56 d++; 57 int ans=sum(c,d)-sum(c,b-1)-sum(a-1,d)+sum(a-1,b-1); 58 printf("%d\n",ans); 59 } 60 } 61 return 0; 62 }
以上是关于POJ - 1195 - Mobile phones的主要内容,如果未能解决你的问题,请参考以下文章