//最基本的树状数组
#include<iostream>
#include<cstring>
#define size 1000
using namespace std;
int A[size],C[size],N;
void add(int x,int d);
int lowbit(int x);
int sum(int x);
void build();
int lowbit(int x) //求x得二进制表达式中最右边的1对应的值(不是序号)
{
return x&-x;
}
void build() //初始化数组
{
for(int i=1;i<=N;i++)
{
add(i,A[i]);
}
}
void add(int x,int d) //在X的位置加上大小为d的数
{
while(x<=N)
{
C[x]+=d;
x+=lowbit(x);
}
}
int sum(int x) //求1到X的和
{
int ret=0;
while(x>=1)
{
ret+=C[x];
x=x-lowbit(x);
}
return ret;
}
int main()
{
cin>>N;
memset(C,0,sizeof(C));
for(int i=1;i<=N;i++)
{
cin>>A[i];
}
build();
for(int i=1;i<=N;i++)
{
cout<<C[i]<<" ";
}
cout<<endl;
for(int i=1;i<=N;i++)
{
cout<<sum(i)<<" ";
}
cout<<endl;
return 0;
}
树状数组
最新推荐文章于 2024-07-02 22:40:02 发布