树状数组改点求段

#include<stdio.h>
int a[20],n;
int lowbit(int x)
{
    return x&(-x);
}

void add(int x,int c)
{
    int i;
    for(i=x; i<=n; i+=lowbit(i))a[i]+=c;
}
int sum(int x)
{
    int s=0,i;
    for(i=x; i; i-=lowbit(i))s+=a[i];
    return s;
}
int main()
{
    scanf("%d",&n);
    add(10,2);//把a[10]加2
printf("%d",sum(n));//输入10则a[1]到a[10]的和为2(a初始全为0)

    return 0;
}

上面是最基本的改点求段
add 使a[x]加c

sum 求 1...x 的和
●注意 x 不能是 0

例2

#include<stdio.h>
int a[50],n;
int lowbit(int x)
{
    return x&(-x);
}

void add(int x,int c)
{
    int i;
    for(i=x; i<=n; i+=lowbit(i))a[i]+=c;
}
int sum(int x)
{
    int s=0,i;
    for(i=x; i; i-=lowbit(i))s+=a[i];
    return s;
}
int main()
{
int i;
      scanf("%d",&n);
for(i=1;i<=20;i++)add(i,i);//给a[i]赋值i
printf("%d",sum(n));//求a[1]到a[n]的和
    return 0;
}
posted @ 2014-07-21 22:02  CodeNoob  阅读(179)  评论(0编辑  收藏  举报