二维的树状数组模板
int lowbit(int x)
{
return x & (-x);
}
void modify(int x,int y,int data)
{
for(int i=x;i<MAXN;i+=lowbit(i))
for(int j=y;j<MAXN;j+=lowbit(j))
a[i][j]+=data;
}
int get_sum(int x,int y)
{
int res=0;
for(int i=x;i>0;i-=lowbit(i))
for(int j=y;j>0;j-=lowbit(j))
res+=a[i][j];
return res;
}
直接套模板就行了。
因为本身的区间坐标涉及0 所以要输入的坐标+1 向后推一下。
二维求和涉及一个基本的容斥。
#include<bits/stdc++.h>
#define N 1011
#define LL long long
using namespace std;
int n,a[N][N];
bool flag[N][N];
int lowbit(int x)
{
return x&(-x);
}
int sw(int x,int y,int temp)
{
for(int i=x;i<N;i+=lowbit(i))
for(int j=y;j<N;j+=lowbit(j))
a[i][j]+=temp;
}
int sum(int x,int y)
{
int s=0;
for(int i=x;i>0;i-=lowbit(i))
for(int j=y;j>0;j-=lowbit(j))
s+=a[i][j];
return s;
}
int main()
{
int T,n,m,x1,x2,y1,y2,ans;
char ch;
scanf("%d",&T);
memset(flag,false,sizeof(flag));
memset(a,0,sizeof(a));
while(T--)
{
getchar();
scanf("%c",&ch);
if(ch=='B')
{
scanf("%d%d",&n,&m);
n+=1;m+=1;
if(flag[n][m]) continue;
sw(n,m,1);
flag[n][m]=true;
}
else if(ch=='D')
{
scanf("%d%d",&n,&m);
n+=1;m+=1;
if(!flag[n][m]) continue;
sw(n,m,-1);
flag[n][m]=false;
}
else
{
scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
x1+=1,x2+=1,y1+=1,y2+=1;
if(x1>x2) swap(x1,x2);
if(y1>y2) swap(y1,y2);
ans=sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1);
printf("%d\n",ans);
}
}
return 0;
}