BZOJ 3720 Gty的妹子樹

2022-05-13 10:07:23 字數 1420 閱讀 7517

bzoj 3720 傳送門

這時考慮在樹上分塊,具體內部的操作和在序列上相同

每次通過判斷父節點塊的大小判斷是否要新開一塊

注意每一塊在樹上都是連續的,這樣在查詢時子樹時保證最後全是整塊

不過由於上一條特性導致遇到菊花圖就將每一塊大小卡到了1

複雜度穩定的演算法其實是對修改操作進行分塊:

每$sqrt(q)$次修改後就暴力重構主席樹,複雜度$o(n*log(n)*sqrt(n))$

每次查詢先找到上次暴力重構的結果,再對之後的$sqrt(q)$次詢問用倍增找到其對答案的影響

這樣總複雜度是穩定的$o(n*log(n)*sqrt(n))$

#include using

namespace

std;

#define x first

#define y second

#define pb push_backtypedef

double

db;typedef

long

long

ll;typedef pair

p;const

int maxn=6e4+10,size=305

;struct

block

void update(int x,int

val)

int query(int

x)

}bl[maxn];

struct edge

e[maxn

<<2],eb[maxn<<2

];int

n,q,op,x,y,sub[maxn],w[maxn],f[maxn];

intcnt,tot,totb,head[maxn],headb[maxn],res;

inline

intread()

void add(int x,int

y);head[x]=tot;}

void addb(int x,int

y);headb[x]=totb;}

void dfs(int x,int

anc)

else sub[x]=sub[anc],bl[sub[anc]].insert(w[x]);

for(int i=head[x];i;i=e[i].nxt)

if(e[i].to!=anc)

f[e[i].to]=x,dfs(e[i].to,x);

}int calblock(int x,int

val)

int cal(int x,int

val)

return

ret;

}int

main()

else

else}}

return0;

}

bzoj3720 Gty的妹子樹

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

BZOJ3720 Gty的妹子樹

如果沒有插入操作,那麼直接對dfs序建立線段樹套平衡樹即可,有插入操作的話,將外層的線段樹換成重量平衡樹即可。一開始寫替罪羊樹套權值線段樹無限mle 所以只好寫替罪羊樹套treap include include includeusing namespace std typedef unsigned...

BZOJ3720 Gty的妹子樹

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