标签:实例代码 复制 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