标签:实例代码 复制 mem title 结束 数组 itblog adl 数据结构
1
2
3
|
int lowbit( int x){ return x&(x^(x–1)); } |
1
2
3
|
int lowbit( int x){ return x&(-x); } |
/****************************************** 树状数组: *****************************************/ #include<stdio.h> #include<stdlib.h> #include<string.h> int a[17],c[17]; //Cn = A(n – 2^k + 1) + ... + An //算这个2^k有一个快捷的办法,定义一个函数如下即可: int lowbit(int x) { return x&(-x); } int sum(int n) { int sum=0; while(n>0) { sum += c[n]; n = n-lowbit(n); } return sum; } //某个几点加上一个数 void Add(int pos,int b,int max) { while(pos<=max) { c[pos] += b; pos = pos+lowbit(pos); } } //某个节点乘上一个数 void Muil(int pos,int b,int max) { while(pos<=max) { c[pos] *=b; pos = pos + lowbit(pos); } } //显示数组 void display(int* a) { int i; for(i=1;i<=a[0];i++) { printf("%d ",a[i]); } printf("\n"); } int main() { int choice,num,pos,max=16; memset(c,0,sizeof(c)); memset(a,0,sizeof(a)); c[0]=16; a[0]=16; printf("加(1),位置(pos)、数(a)\n"); printf("减(-1),位置(pos)、数(a)\n"); printf("乘(0),位置(pos)、数(a)\n"); printf("和(2),位置(pos)、0\n"); printf("3 0 0,显示a、c素组\n"); while(scanf("%d%d%d",&choice,&pos,&num)!=EOF) { switch(choice) { case 1: a[pos] +=num; Add(pos,num,max); break; case -1: a[pos] -=num; Add(pos,(-1)*num,max); break; case 0: a[pos] *=num; Muil(pos,num,max); break; case 2: printf("%d\n",sum(pos)); break; case 3: display(a); display(c); } } return 0; }
标签:实例代码 复制 mem title 结束 数组 itblog adl 数据结构
原文地址:http://www.cnblogs.com/tangshiguang/p/6770669.html