對於平衡樹的新理解。。。(最弱的蒟蒻出品)

2022-08-10 09:15:13 字數 1516 閱讀 8347

#include#include

#include

#include

#include

#define maxn 1000001

using

namespace

std;

int f[maxn],ch[maxn][2

],num[maxn],cnt[maxn],size[maxn];

inttree_size,root,n,p,t,x;

inline

void clear(int

x)//

將這個節點全部清空,清空即將所有資訊初始化為0

inline

intget(int

x)//

每次判斷是在左兒子還是右兒子,並且巧妙地運用了。。。(ch[f[x]][1]==x返回值是1,那麼就是右兒子!!!)

inline

void update(int x)

}inline

void rotate(int

x)inline

void splay(int

x)inline

void insert(int

x)

//還未開始建子樹的判斷

int now=root,father=0

;

while (1

)

//如果沒有重複。。。

father=now;

now=ch[now][num[now]//

如果沒能找到其位置,就繼續根據其權值的大小下放該數

if (now==0)

}}inline

int findx(int x)

}}inline

int find(int x)

ans+=cnt[now];

now=ch[now][1];//

向右擴充套件

} }

}inline

int pre()

inline

int next()

inline

void del(int

x)//

如果有重複直接一步更新

if (!ch[root][0] && !ch[root][1]) //

如果孤苦伶仃,就直接刪除。。。

if (!ch[root][0

])

else

if (!ch[root][1

])

//將左邊的最大移至根節點

int lef=pre(),y=root;

splay(lef);

ch[root][

1]=ch[y][1

]; f[ch[y][

1]]=root;

clear(y);

update(root);

}int

main()

}}}

蒟蒻的線段樹

struct node ll a maxn node tr maxn 2 至於為什麼陣列要開4倍 能用就行 以及區間查詢 ll query int x,int l,int r interval sum if tr x tag 0 下推lazy tag 區間更新時使用 int mid tr x l t...

蒟蒻萌新的c 深搜指南

適合萌新的c 深搜指南 好吧好吧,我是蒟蒻,但教程肯定是原創的啦,比較符合蒟蒻的水平,就是為了方便自己以後複習啦,dalao不要吐槽,多多指教 先來深搜吧,好不容易學完了,深搜全稱 深度優先搜尋 很高大上的名字有木有!簡單來說就是 不撞南牆心不死 我來畫張圖理解一下哈 深搜廣搜我一般都借助圖來理解啦...

bzoj4636 蒟蒻的數列 線段樹

蒟蒻的數列 bzoj 4636 題目大意 給定乙個序列,初始均為0。n次操作 每次講一段區間中小於k的數都變成k。操作的最後詢問全域性和。注釋 1 le n le 4 cdot 10 4 想法 那個操作就是乙個不好好說話的操作,說白了就是對區間的每乙個數取max 然後我們對於那個序列建立分治線段樹。...