zoj 2112 主席樹套樹狀陣列 優化

2021-08-11 16:37:39 字數 1099 閱讀 3441

題解思路:如果直接對原來的陣列建立主席樹套樹狀陣列的空間複雜度是((n+m)log(n+m)*log(n+m))這樣明顯**,那麼我們可以對原來的數組建主席樹模型,空間複雜度就是n*logn,對m裡面的修改建主席樹套樹狀陣列空間複雜度是m*logm*logm明顯小了很多。

#include#define lson l,mid

#define rson mid+1,r

using namespace std;

typedef long long ll;

int n,m,k,cnt,r,l;

const int mx = 6e4+10;

int num[mx],root[mx],kep[mx],ran[mx],now[mx];

int ls[30*mx],rs[30*mx],sum[30*mx],size;

struct nodes[mx/3];

void update(int x,int &y,int l,int r,int m,int v)

inline int lowbit(int x)

int get_sum(int x)

return ans;

}int query(int l,int r,int lt,int rt,int k)

for(int i=l;i>0;i-=lowbit(i)) kep[i] = rs[kep[i]];

for(int i=r;i>0;i-=lowbit(i)) kep[i] = rs[kep[i]];

return query(rson,rs[lt],rs[rt],k-ret);

}void add(int x,int p,int v)

int main()

else

}n = 1;

sort(ran+1,ran+k+1);

for(int i=2;i<=k;i++)

if(ran[i]!=ran[i-1]) ran[++n] = ran[i];

for(int i=1;i<=cnt;i++)

for(int i=1;i<=m;i++)else

} }return 0;

}

zoj 2112 主席樹套樹狀陣列

現在把主席樹的原理給弄清楚了,從i 1開始,每次新插入乙個數,就為他建一棵線段樹 當然第一次i 0的時候是建一棵空樹 線段樹裡面儲存的是1 i的樹的位置情況 簡單來說,如果有m個樹,則每棵線段樹都是範圍為1 m的,至於1 i沒有m個那就先讓它空著不管,我只負責1 i裡面的數的位置情況插入到線段樹裡面...

Zoj 2112 線段樹套Treap

樹套樹入門題 樹套樹空間複雜度分析 維護乙個長度為n的序列,線段樹的結點數一般為4n,而treap則是對於每乙個元素 包括重複出現的 都需要乙個空間,那麼第1層的所需要的空間為 1 n 第二層為 2 n 2 所以其實為o h n.那麼所需的空間為o nlog n 但在實際運用中,所形成的線段樹往往不...

ZOJ 2112 線段樹套平衡樹

題目大意 給定乙個數列,定義兩種操作 1 修改第n個數的值 2 求 l,r 區間內第k大的值。方法 線段樹維護區間,treap樹維護第k大 splay當然也可以 樹套樹第一題。沒想到真的是每個線段樹上的節點建一棵平衡樹。然後修改值就是在所有相關區間內的平衡樹里,erase乙個值再insert乙個值。...