題解思路:如果直接對原來的陣列建立主席樹套樹狀陣列的空間複雜度是((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乙個值。...