裸题~
#include<cstdio>
#include<iostream>
using namespace std;
#define maxn 1005
#define lb(x) (x&(-x))
int c[maxn][maxn];
void update(int x,int y,int w)
{
for(int i=x;i<maxn;i+=lb(i))
for(int j=y;j<maxn;j+=lb(j))
c[i][j]+=w;
}
int sum(int x,int y)
{
int ans=0;
for(int i=x;i>0;i-=lb(i))
for(int j=y;j>0;j-=lb(j))
ans+=c[i][j];
return ans;
}
int getsum(int x1,int y1,int x2,int y2){return sum(x2,y2)+sum(x1-1,y1-1)-sum(x1-1,y2)-sum(x2,y1-1);}
int main()
{
char ss[5];
int n;
int x1,x2,y1,y2;
while(~scanf("%d",&n))
{
memset(c,0,sizeof c);
for(int i=0;i<n;++i)
{
scanf("%s",ss);
if(ss[0]=='B')
{
scanf("%d%d",&x1,&y1);
x1++,y1++;
int ans=getsum(x1,y1,x1,y1);
if(!ans)update(x1,y1,1);
}
else if(ss[0]=='D')
{
scanf("%d%d",&x1,&y1);
x1++;y1++;
int ans=getsum(x1,y1,x1,y1);
if(ans)update(x1,y1,-1);
}
else if(ss[0]=='Q')
{
scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
x1++,x2++,y1++,y2++;
if(x1>x2)swap(x1,x2);
if(y1>y2)swap(y1,y2);
printf("%d\n",getsum(x1,y1,x2,y2));
}
}
}
}

本文深入解析了一道裸题,通过使用C++实现矩阵操作和区间更新查询的功能,包括如何进行矩阵更新和计算指定区间的元素之和。通过实例演示了算法的应用过程,有助于理解矩阵和区间操作的基本原理。

359

被折叠的 条评论
为什么被折叠?



