http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=binaryIndexedTrees 超级讲解,
hdu1166 敌兵布阵
单点修改, 区间查询, (区间和)
const int maxn=50000+123;
int a[maxn], c[maxn];
int n;
int sum(int x)
{
for (int res=0; ; res+=c[x], x-=lowbit(x))if(x==0)return res;
}
void add(int x, int v)
{
for (;x<=n; x+=lowbit(x))c[x]+=v;
}
void build()
{
clean(c, 0);
for (int i=1; i<=n; ++i) add(i, a[i]);
}
int main ()
{
int t; scanf("%d", &t);
for (int I=1; I<=t; ++I)
{
scanf("%d", &n);
for (int i=1; i<=n; ++i) scanf("%d", a+i);
build();
char op[10];
printf("Case %d:\n", I);
while(scanf("%s", op))
{
if(op[0]=='E')break;
int a, b; scanf("%d%d", &a, &b);
// printf("%d %d\n", lowbit(a), lowbit(b));
// printf("%d %d\n", sum(a), sum(b));
if(op[0]=='Q')
printf("%d\n", sum(b)-sum(a-1));
if(op[0]=='A')add(a, b);
if(op[0]=='S')add(a, -b);
}
}
return 0;
}
http://codeforces.com/problemset/problem/216/C
区间更新, 单点查询, 别人都是暴力过的, 我用树状数组却错了, 不相信爱情了。。。
ll C[2*maxn];
int N;
int Query(int x)
{
for (int res=0; ; res+=C[x], x-=lowbit(x))if(x==0)return res;
}
void Update(int x, int v)
{
for (;x<=N; x+=lowbit(x))C[x]+=v;
}
void IUpdate(int s, int t, int v)
{
Update(t+1, -v);
Update(s, v);
}
int ans[10000+123];
int total;
int main ()
{
int n, m, k;
while (~scanf("%d%d%d", &n, &m, &k))
{
N=(n+m)<<1;
total=0;
clean(C, 0);
for (int i=1; i<=n+m; ++i)
{
int t=k-Query(i);
// for (int j=1; j<=n+m; ++j)printf("%d ", Query(j));
// printf("Q=%d D=%d\n", t, i);
// t=k-Query(i);
for (int j=0; j<t; ++j)
{
ans[total++]=i;
IUpdate(i, i+n-1, 1);
///IUpdate(i+n+m, i+n-1+n+m, 1);
}
// printf("%d %d\n", Query(i+1), i+1);
if(Query(i+1)==0)IUpdate(i, i+n-1, 1), ans[total++]=i;
// printf("%d %d\n", Query(i+1), i+1);
}
printf("%d\n", total);
for(int i=0; i<total; ++i)
{
printf("%d ", ans[i]);
}
puts("");
}
return 0;
}