现在的位置: 首页 > 综合 > 正文

树状数组

2018年05月24日 ⁄ 综合 ⁄ 共 601字 ⁄ 字号 评论关闭
//最基本的树状数组
#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;

}
【上篇】
【下篇】

抱歉!评论已关闭.