您的位置:首页 > 理论基础 > 数据结构算法

poj 1195 Mobile phones(树状数组)

2012-08-20 21:30 309 查看
刚接触树状数组,感觉是个很简练的数据结构,虽然我还没怎么明白它的原理。本来想用浙大模版里的树状数组,不过看半天不知道代码什么意思,而且求和的时候坐标向后错了一位,只能在网上找一个了,速度比浙大模版要快一点,不过浙大模版的简练程度让我真心佩服……

#include <cstdio>
#include <iostream>
#include <string.h>
using namespace std;
#define lowbit(x) ((x)&(-x))
#define MAXN 1050
typedef int elem_t;
int n,m,t;
struct sum
{
elem_t a[MAXN][MAXN],c[MAXN][MAXN]ret;
int m,n,t;
void init(int i,int j)
{
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
m=i,n=j;
}
//浙大模版,简练的半天没看懂……
/*void update(int i,int j,elem_t v){
for (v-=a[i][j],a[i++][j++]+=v,t=j;i<=m;i+=lowbit(i))
for (j=t;j<=n;c[i-1][j-1]+=v,j+=lowbit(j));
}
elem_t query(int i,int j){
for (ret=0,t=j;i;i^=lowbit(i))
for (j=t;j;ret+=c[i-1][j-1],j^=lowbit(j));
return ret;
}*/
void modify(int i, int j, int w)
{
while(i<=m)
{
t=j;
while(t<=n)
{
a[i][t]+=w;
t+=lowbit(t);
}
i+=lowbit(i);
}
}
elem_t query(int i,int j)
{
int ans=0;
while(i>0)
{
t=j;
while(t>0)
{
ans+=a[i][t];
t-=lowbit(t);
}
i-=lowbit(i);
}
return ans;
}
}tree;
int main()
{
//freopen("input.txt","r",stdin);
int op;
while(scanf("%d",&op)!=EOF)
{
if(op==0)
{
scanf("%d",&n);
tree.init(n,n);
}
else if(op==1)
{
int x,y,v;
scanf("%d%d%d",&x,&y,&v);
modify(x+1,y+1,v);
}
else if(op==2)
{
int l,b,r,t;
scanf("%d%d%d%d",&l,&b,&r,&t);
printf("%d\n",query(r+1,t+1)-query(r+1,b)-query(l,t+1)+query(l,b));
}
else continue;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mobile query 数据结构 c