您的位置:首页 > 其它

hdu 1892 See you~(二维树状数组)

2017-11-06 16:00 387 查看
二维BIT裸题

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e3+3;
#define lowbit(x) (x&(-x))

int f[MAXN][MAXN],a[MAXN][MAXN];

void add(int x, int y, int val)
{
for(int i = x; i < MAXN; i += lowbit(i))
for(int j = y; j < MAXN; j += lowbit(j))
f[i][j] += val;
}

int sum(int x, int y)
{
int ret = 0;
for(int i = x; i > 0; i -= lowbit(i))
for(int j = y; j > 0; j -= lowbit(j))
ret += f[i][j];
return ret;
}

void init()
{
memset(f,0,sizeof(f));
for(int i = 1; i < MAXN; ++i)
{
for(int j = 1; j < MAXN; ++j)
{
a[i][j] = 1;
add(i,j,1);
}
}
}

int main()
{
int T,q,x1,y1,x2,y2,val,time = 0;
char op;
scanf("%d",&T);
while(T--)
{
init();
printf("Case %d:\n",++time);
scanf("%d",&q);
while(q--)
{
scanf(" %c",&op);
if(op == 'S')
{
scanf(" %d %d %d %d",&x1,&y1,&x2,&y2);
++x1,++y1,++x2,++y2;
if(x1 > x2) swap(x1,x2);
if(y1 > y2) swap(y1,y2);
printf("%d\n",sum(x2,y2)-sum(x2,y1-1)-sum(x1-1,y2)+sum(x1-1,y1-1));
}
else if(op == 'A')
{
scanf(" %d %d %d",&x1,&y1,&val);
++x1,++y1;
add(x1,y1,val);
a[x1][y1] += val;
}
else if(op == 'D')
{
scanf(" %d %d %d",&x1,&y1,&val);
++x1,++y1;
val = min(val,a[x1][y1]);
add(x1,y1,-val);
a[x1][y1] -= val;
}
else
{
scanf(" %d %d %d %d %d",&x1,&y1,&x2,&y2,&val);
++x1,++y1,++x2,++y2;
val = min(a[x1][y1],val);
add(x1,y1,-val);
a[x1][y1] -= val;
add(x2,y2,val);
a[x2][y2] += val;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: