您的位置:首页 > 其它

poj1195解题报告

2010-04-26 00:03 337 查看
赤裸裸的二维树状数组。需要注意的就是如何求矩形(a,b)-(c,d)(左下角至右上角)的sum。

#include<iostream>
using namespace std;
int rec[1050][1050];
int maxn=-1;
int lowbit(int x)
{
return x&(-x);
}
int cal(int x,int y)
{
int temp;
int sum=0;
while(x>0)
{
temp=y;
while(temp>0)
{
sum=sum+rec[x][temp];
temp=temp-lowbit(temp);
}
x=x-lowbit(x);
}
return sum;
}
void add(int x,int y,int num)
{
int temp;
while(x<=maxn)
{
temp=y;
while(temp<=maxn)
{
rec[x][temp]=rec[x][temp]+num;
temp=temp+lowbit(temp);
}
x=x+lowbit(x);
}
}
void init(int num)
{
int i,j;
maxn=num;
for(i=1;i<=maxn;i++)
{
for(j=1;j<=maxn;j++)
rec[i][j]=0;
}
}
int main()
{
int n,a,b,c,d;
int sum;
while(1)
{
scanf("%d",&n);
if(n==3)
break;
if(n==0)
{
scanf("%d",&a);
init(a);
}
if(n==1)
{
scanf("%d %d %d",&a,&b,&c);
add(a+1,b+1,c);
}
if(n==2)
{
sum=0;
scanf("%d %d %d %d",&a,&b,&c,&d);
sum=sum+cal(c+1,d+1);
sum=sum+cal(a,b);
sum=sum-cal(a,d+1);
sum=sum-cal(c+1,b);
printf("%d/n",sum);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c