BZOJ3720 Gty的妹子樹

2021-09-06 18:14:20 字數 1528 閱讀 3862

如果沒有插入操作,那麼直接對dfs序建立線段樹套平衡樹即可,

有插入操作的話,將外層的線段樹換成重量平衡樹即可。

一開始寫替罪羊樹套權值線段樹無限mle…

所以只好寫替罪羊樹套treap…

#include#include#includeusing namespace std;

typedef unsigned int uint;

const int n=120010;

struct node

inline void up()

}*blank=new(node);

const double a=0.7;

int size[n],son[n][2],val[n],f[n],tot,root,deep;

int data[n],id[n],cnt;

node *h[n];

int g[n],nxt[n],to[n],ed,w[n];

int st[n],en[n],dfn,ans;

//init begin

inline void add(int x,int y)

void dfstree(int x,int pre)

//init end

//treap begin

inline void rotatel(node*&x)

inline void rotater(node*&x)

void insert(node*&x,int p)

x->sum++;

if(p==x->val)

if(pval)else

}void delete(node*&x,int p)

if(pval)delete(x->l,p);else delete(x->r,p);

}int ask(node*&x,int p)

void deltree(node*&x)

//treap end

//scapegoat begin

inline int newnode(int x,int p,int fa)

inline int newnode(int x,int p,int fa)

int ins(int x,int p,int b)

void dfs(int x)

int build(int fa,int l,int r)

inline int rebuild(int x)

inline int kth(int k,int p)

} deep=0;int z=x;while(f[z])z=f[z],deep++;

if(deepk;

if(cmid)ask(son[x][1],mid+1,b,c,d,k);

}//scapegoat end

inline void read(int&a)

int n,q,x,y,k,i,ch;

int main()else if(ch==1)else

} return 0;

}

bzoj3720 Gty的妹子樹

我們可以樹上分塊,詳見我部落格中雜文下的根號演算法題庫 然後每個塊維護降序,對於整一塊在子樹內的就可以二分,其餘部分暴力。include include include include define fo i,a,b for i a i b i using namespace std const i...

BZOJ3720 Gty的妹子樹

題目 題解 傳說中的塊狀樹。和鏈剖思想差不多,能塞到父親塊裡的就塞,否則自己新開一塊。只是比較糾結樹分塊究竟用什麼?如果是樹上莫隊的話好像不能這麼分?被菊花卡死?然後我們就每個塊暴力維護資訊。剛開始以為set就行了,到了寫查詢的時候發現尼瑪set是不能維護名次的t t 還是老老實實寫線性表吧。塊開s...

BZOJ 3720 Gty的妹子樹

bzoj 3720 傳送門 這時考慮在樹上分塊,具體內部的操作和在序列上相同 每次通過判斷父節點塊的大小判斷是否要新開一塊 注意每一塊在樹上都是連續的,這樣在查詢時子樹時保證最後全是整塊 不過由於上一條特性導致遇到菊花圖就將每一塊大小卡到了1 複雜度穩定的演算法其實是對修改操作進行分塊 每 sqrt...