POJ(1195)(单点修改,区间查询)(二维)
生活随笔
收集整理的這篇文章主要介紹了
POJ(1195)(单点修改,区间查询)(二维)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目大意
給定一個(gè)N*N的網(wǎng)格,剛開始每個(gè)網(wǎng)格的值都是0,接下來會(huì)對(duì)這些網(wǎng)格進(jìn)行操作,有一下兩種操作:
1、”X Y A“對(duì)網(wǎng)格C[x][y]增加A
2、”L B R T“ 查詢所有(L<=X<=R,B<=Y<=T)的網(wǎng)格],并返回它們的總和
?
如果是針對(duì)于單點(diǎn)修改,那是比區(qū)間修改好打很多,因?yàn)檫@個(gè)只需要將區(qū)間拆分成許多個(gè)樹狀數(shù)組就可以了,
然后修改的時(shí)候?qū)錉顢?shù)組修改,十分好理解的。
查詢的話就是二維前綴和的查詢,然后就可以了。
?
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cmath> 6 #define N 1057 7 using namespace std; 8 9 int n,k; 10 int a[N][N]; 11 12 int lowbit(int x) 13 { 14 return x&(-x); 15 } 16 void add(int x,int y,int z) 17 { 18 for (int i=x;i<=n;i+=lowbit(i)) 19 for (int j=y;j<=n;j+=lowbit(j)) 20 a[i][j]+=z; 21 } 22 int query(int x,int y) 23 { 24 int res=0; 25 for (int i=x;i>=1;i-=lowbit(i)) 26 for (int j=y;j>=1;j-=lowbit(j)) 27 res+=a[i][j]; 28 return res; 29 } 30 int main() 31 { 32 while(scanf("%d",&k)) 33 { 34 if (k==0) 35 { 36 scanf("%d",&n); 37 for (int i=1;i<=n;i++) 38 for (int j=1;j<=n;j++) 39 a[i][j]=0; 40 } 41 if (k==1) 42 { 43 int x,y,z; 44 scanf("%d%d%d",&x,&y,&z); 45 x++,y++; 46 add(x,y,z); 47 } 48 if (k==2) 49 { 50 int x1,x2,y1,y2; 51 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 52 x1++,x2++,y1++,y2++; 53 cout<<query(x2,y2)+query(x1-1,y1-1)-query(x1-1,y2)-query(x2,y1-1)<<endl; 54 } 55 if (k==3) break; 56 } 57 }?
轉(zhuǎn)載于:https://www.cnblogs.com/fengzhiyuan/p/7573275.html
總結(jié)
以上是生活随笔為你收集整理的POJ(1195)(单点修改,区间查询)(二维)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于PHP数组方法array_walk的
- 下一篇: 当重复调用addsubview时出现显示