您的位置:首页 > 其它

POJ 1195 Mobile phones

2013-04-15 21:05 302 查看
题目链接:http://poj.org/problem?id=1195

二维树状数组的应用

#include <cstdio>
#include <cstring>
#include <cstdlib>

const int MAXN = 1200;
int S;
int C[MAXN][MAXN];

int lowbit( int x )
{
return x & -x;
}

void Add( int x, int y, int add )
{
int tpy;
while ( x <= S )
{
tpy = y;
while ( tpy <= S )
{
C[x][tpy] += add;
tpy += lowbit(tpy);
}
x += lowbit(x);
}
return;
}

int Sum( int x, int y )
{
int ret = 0;
while ( x > 0 )
{
int tpy = y;
while ( tpy > 0 )
{
ret += C[x][tpy];
tpy -= lowbit(tpy);
}
x -= lowbit(x);
}
return ret;
}

int main()
{
int op, add;
int x1, y1, x2, y2;
while( ~scanf( "%d%d", &op, &S ) )
{
memset( C, 0, sizeof(C) );
while ( scanf( "%d", &op ), op != 3 )
{
if ( op == 1 )
{
scanf( "%d%d%d", &x1, &y1, &add );
++x1, ++y1;
Add( x1, y1, add );
}
else
{
scanf( "%d%d%d%d", &x1, &y1, &x2, &y2 );
++x1, ++y1;
++x2, ++y2;
printf("%d\n", Sum(x2, y2) - Sum(x1 - 1, y2) - Sum(x2, y1 - 1) + Sum(x1 - 1, y1 - 1) );
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: