POJ2155 - Matrix(二维树状数组)
生活随笔
收集整理的這篇文章主要介紹了
POJ2155 - Matrix(二维树状数组)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
POJ2155 - Matrix
文章目錄
- 題目
- 題解:
- 代碼
題目
給你一個二維矩陣,初始化為0,然后可以進行兩次操作:
C:x,y,x1,y2 對該小矩陣內的數(shù)進行取反
Q:查詢某個點是0還是1
題解:
C是區(qū)間修改,Q是單點查詢,
我們將二維矩陣先簡化成一維矩陣的情況,C是對一段區(qū)域[l,r]取反,我們沒有必要對這段區(qū)域全部操作,我們只需要對點l和點(r+1)分別加1即可,然后查詢k時,我們只需要求出k的前綴和,然后mod2即可
為什么?
如果,當k1在區(qū)間[l,r]里,k的前綴和比之前就了一個1,mod2之后就說明k1被改變了一次;當k2在[l,r]之前,沒有影響;在[l,r]之后,k3的前綴和比原本多了2(l和r+1點分別多貢獻一),mod 2之后就沒影像了,相當于沒改變
也就是當k的前綴和比原本多出奇數(shù)時,說明值比原先發(fā)生改變,否則就沒有。
所以我們對于一個區(qū)間[L,R],我們只需要改變點(L)和點(R+1),
同樣回到本題,二維矩陣也是這樣,
左上角是x1,y1,右下角是x2,y2
a[x1][y1]+1,
a[x2+1][y2]+1
a[x1][y2+1]+1,
a[x2+1][y1+1]+1
原理和上面一樣
詳細看圖
然后用前綴和和二維樹狀數(shù)組來維護,單點更改,單點查詢
代碼
#include<bits/stdc++.h> using namespace std; const int maxn=2000; int a[maxn][maxn]; int n; string s; int lowbit(int x) {return x&(-x); } void add(int x,int y,int w) {for(int i=x;i<=n;i+=lowbit(x)){for(int j=y;j<=n;j+=lowbit(y)){a[i][j]+=w;}} } int sum(int x,int y) {int ans=0;for(int i=x;i;i-=lowbit(i)){for(int j=y;j;j-=lowbit(j)){ans+=a[i][j];}}return ans; } int main() {int t;cin>>t;int x1,y1,x2,y2;while(t--){int k;cin>>n>>k;memset(a,0,sizeof(a));for(int i=1;i<=k;i++){cin>>s;if(s[0]=='C'){cin>>x1>>y1>>x2>>y2;add(x1,y1,1);add(x2+1,y1,1);add(x1,y2+1,1);add(x2+1,y2+1,1);}else {int x,y;cin>>x>>y;cout<<sum(x,y)%2<<endl;}}} }總結
以上是生活随笔為你收集整理的POJ2155 - Matrix(二维树状数组)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何关闭自己的qq空间(怎么关闭qq空间
- 下一篇: Matrix Subtraction(小