用树状数组实现的平衡树

一、题目:

洛谷模板

二、思路:

用树状数组实现的平衡树,实现起来很简单,但有很多细节需要考虑。

维护一个权值树状数组,查排名时直接前缀和,前驱、后继都很简单。比较难的是已知排名求值,需要倍增。

怎么能写二分呢?倍增比二分快几百倍。——LSH

需要离散化,而细节很多,具体看代码。

三、代码:

#include
#include
#include

using namespace std;
inline int read(void){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return f*x;
}

const int maxn=100005;

int n,b[maxn],cnt;

struct Opt{
    int opt,x;
}q[maxn];

struct BIT{
    int tree[maxn];
    inline int lowbit(int x){return x&(-x);}
    inline void add(int p,int x){
        while(p<=cnt){
            tree[p]+=x;
            p+=lowbit(p);
        }
    }
    inline int rank(int p){
        int ans=1;--p;
        while(p>0){
            ans+=tree[p];
            p-=lowbit(p);
        }
        return ans;
    }
    
    inline int val(int rank){
        int ans=0,Cnt=0;
        for(register int i=20;i>=0;--i){
            ans+=(1<cnt||Cnt+tree[ans]>=rank)ans-=(1<

转载于:https://www.cnblogs.com/little-aztl/p/9746207.html

你可能感兴趣的:(用树状数组实现的平衡树)