#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; }