POJ 2352 一维树状数组
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
#define inf 0x3f3f3f3f
#define PI acos(-1.0)
#define lowbit(x) (x&-x)
typedef long long ll;
const int maxn=32010;
int level[maxn],c[maxn],n;
int sum(int x)
{
int ret=0;
while(x>0)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
void add(int x)
{
while(x<maxn)
{
c[x]+=1;
x+=lowbit(x);
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(level,0,sizeof(level));
memset(c,0,sizeof(c));
for(int i=0;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
x++;
level[sum(x)]++;
add(x);
}
for(int i=0;i<n;i++)
printf("%d\n",level[i]);
}
return 0;
}
POJ 1195 二维树状数组
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
#define inf 0x3f3f3f3f
#define PI acos(-1.0)
#define lowbit(x) (x&(-x))
typedef long long ll;
const int maxn=1100;
int c[maxn][maxn],s;
int sum(int x,int y)
{
int ret=0;
while(x>0)
{
int yy=y;
while(yy>0)
{
ret+=c[x][yy];
yy-=lowbit(yy);
}
x-=lowbit(x);
}
return ret;
}
void add(int x,int y,int d)
{
while(x<=s)
{
int yy=y;
while(yy<=s)
{
c[x][yy]+=d;
if(c[x][yy]<0)
c[x][yy]=0;
yy+=lowbit(yy);
}
x+=lowbit(x);
}
}
int main()
{
int n;
while(scanf("%d%d",&n,&s)!=EOF)
{
memset(c,0,sizeof(s));
while(1)
{
scanf("%d",&n);
if(n==3)
break;
if(n==1)
{
int x,y,d;
scanf("%d%d%d",&x,&y,&d);
x++,y++;
add(x,y,d);
}
else if(n==2)
{
int l,b,r,t;
scanf("%d%d%d%d",&l,&b,&r,&t);
l++,b++,r++,t++;
int ans=sum(r,t)-sum(l-1,t)-sum(r,b-1)+sum(l-1,b-1);
printf("%d\n",ans);
}
}
}
return 0;
}