Matrix
POJ - 2155
二维树状数组和一维的树状数组类似:
就是多了一层循环
例如要更新一个某个点的值
void add(int x,int y,int k)
{
for(int i=x;i<=n;i+=lowb(i))
{
for(int j=y;j<=n;j+=lowb(j))
{
F[i][j]+=k;
}
}
}
进行区间修改单点查询
1. add(x,y,1);
2. add(x,y1+1,-1);
3. add(x1+1,y,-1);
4. add(x1+1,y1+1,-1);
相当于一个矩阵分成四块
1 2
3 4
要修改第一块矩阵的值 第一块+1 相当于4块矩阵内的值都+1
操作2 相当于把2 4 内的值都减一
操作3相当于把3 4 内的值都减一
操作4 相当于把 4 内的值 再加上1
和一维树状数组的区间更新类似
之后再进行getsum的时候求得的就是这个点的值
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#define lowb(x) x&-x
#define mem(a,b) memset(a,b,sizeof(a))
#define maxn 1005
using namespace std;
int F[maxn][maxn];
int sum[maxn][maxn];
int n,q;
void init()
{
mem(F,0);
mem(sum,0);
}
void add(int x,int y,int k)
{
for(int i=x;i<=n;i+=lowb(i))
{
for(int j=y;j<=n;j+=lowb(j))
{
F[i][j]+=k;
}
}
}
int getsum(int x,int y)
{
int ans=0;
for(int i=x;i>0;i-=lowb(i))
{
for(int j=y;j>0;j-=lowb(j))
{
ans+=F[i][j];
}
}
//cout<<"ans="<<ans<<endl;
return ans;
}
int main()
{
ios::sync_with_stdio(0);
int t;cin>>t;
char str;
int x,y,x1,y1;
int cnt=0;
while(t--)
{
init();
cin>>n>>q;
while(q--)
{
cin>>str;
if(str=='C')
{
cin>>x>>y>>x1>>y1;
add(x,y,1);
add(x,y1+1,-1);
add(x1+1,y,-1);
add(x1+1,y1+1,-1);
}
if(str=='Q')
{
cin>>x1>>y1;
int ans=getsum(x1,y1);
if(ans%2==0)cout<<0<<endl;
else cout<<1<<endl;
}
}
if(t)cout<<endl;
}
}
http://blog.csdn.net/z309241990/article/details/9615259