您的位置:首页 > 其它

hdu 1892【二维树状数组】

2012-03-23 22:06 501 查看
O(∩_∩)O哈哈~二维树状数组被我搞出来了,太开心了,第一道二维树状数组,(~ o ~)~zZ

虽然中途还是出问题了,就是S询问的时候我没有考虑坐标的大小问题,还是搜了别人的代码才知道的,看来自己考虑问题不周到,~~~~(>_<)~~~~

View Code

#include <cstdio>
#include <cstring>
#include <algorithm>

int book[1005][1005];
int size = 1002;
void insert(int x,int y,int num)
{
for(int i = x;i <= size;i += (i&(-i)))
{
for(int j = y;j <= size;j += (j&(-j)))
{
book[i][j] += num;
}
}
}

int getsum(int x,int y)
{
int sum = 0;
for(int i = x;i > 0;i -= (i&(-i)))
{
for(int j = y;j > 0;j -= (j&(-j)))
{
sum += book[i][j];
}
}
return sum;
}
void init()
{
for(int i = 1;i <= size;i ++)
{
for(int j = 1;j <= size;j ++)
{
insert(i,j,1);
}
}
}
int main()
{
int T,cas = 1;
scanf("%d",&T);
while(T -- )
{
printf("Case %d:\n",cas ++);
int n;
scanf("%d",&n);
memset(book,0,sizeof(book));
init();
char s[3];
while( n --)
{
scanf("%s",s);
if(s[0] == 'S')
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a > c) std::swap(a,c);//!
if(b > d) std::swap(b,d);
printf("%d\n",getsum(c+1,d+1)+getsum(a,b)-getsum(c+1,b)-getsum(a,d+1));
}
else if(s[0] == 'A')
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
insert(a+1,b+1,c);
}
else if(s[0] == 'D')
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int num = getsum(a+1,b+1) + getsum(a,b) - getsum(a,b+1) - getsum(a+1,b);
if(num < c)
insert(a+1,b+1,-num);
else
insert(a+1,b+1,-c);
}
else if(s[0] == 'M')
{
int a,b,c,d,e;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
int num = getsum(a+1,b+1) + getsum(a,b) - getsum(a,b+1) - getsum(a+1,b);
if(num < e)
{
insert(a+1,b+1,-num);
insert(c+1,d+1,num);
}
else
{
insert(a+1,b+1,-e);
insert(c+1,d+1,e);
}
}
}
}
return 0;
}


还有就是坐标从0,0开始的,要记得加1……细节~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: