您的位置:首页 > 其它

poj1195 mobile phones 【二维树状数组】

2014-05-20 12:21 375 查看
一次AC

二维树状数组,有模版很好办

注意二维树状数组这个下标是[1][1]的

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int Max = 1030;
int row, col, ar[Max][Max];
//  二维的其实下标为[1][1],这个要记得。
int lowbit(int x)
{
return x & (-x);
}

void add(int i, int j, int w)
{
int tmpj;
while(i <= row)
{
tmpj = j;
while(tmpj <= col)
{
ar[i][tmpj] += w;
tmpj += lowbit(tmpj);
}
i += lowbit(i);
}
}

int sum(int i, int j)
{
int tmpj, ans = 0;
while(i > 0)
{
tmpj = j;
while(tmpj > 0)
{
ans += ar[i][tmpj];
tmpj -= lowbit(tmpj);
}
i -= lowbit(i);
}
return ans;
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("G:/1.txt","r",stdin);
freopen("G:/2.txt","w",stdout);
#endif
int tmp,n;
scanf("%d%d",&tmp,&n);
row=col=n;
while(true)
{
int kind,x,y,xx,yy,v;
scanf("%d",&kind);
if(kind==1)
{
scanf("%d%d%d",&x,&y,&v);
add(x+1,y+1,v);
}
else if(kind==2)
{
scanf("%d%d%d%d",&x,&y,&xx,&yy);
x++;y++;xx++;yy++;
printf("%d\n",sum(xx,yy)-sum(xx,y-1)-sum(x-1,yy)+sum(x-1,y-1));
}
else
{
break;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: