樹上分塊 Gty的妹子樹

2021-09-26 09:49:56 字數 1773 閱讀 7308

我們需要查詢樹上問題資訊,考慮樹上分塊。

我們可以把樹分成大小為n

\sqrt n

n​的若干個連通塊。每乙個塊內用結構體記錄,支援修改操作,插入操作和查詢操作。現在我們考慮如何實現下面三個操作:

照樣每一次操作的時間複雜度是o(n

)o(\sqrt n)

o(n​)的。

對於詢問x子樹的答案,我們可以根據分塊特性分成兩部分:

所以這是乙個敲難寫的分塊。而且各種tle。

#include

using

namespace std;

const

int n =

30005

;int n, t, cnt, lastans, q, tot1 =

0, tot2 =0;

int bel[n]

, val[n]

, fa[n]

, link1[n]

, link2[n]

;struct node e1[n*2]

, e2[n*2]

;void

ins1

(int x,

int y)

; link1[x]

= tot1;

}void

ins2

(int x,

int y)

; link2[x]

= tot2;

}struct lump

inline

intask

(int x)

inline

void

change

(int x,

int v)

} lump[n]

;inline

void

dfs(

int x,

int f)

else lump[bel[x]

= bel[f]].

insert

(val[x]);

for(

register

int i=link1[x]

;i;i=e1[i]

.next)

return;}

inline

intdfs1

(int x,

int v)

return ans;

}inline

intdfs2

(int x,

int v)

return ans;

}inline

void

work

(void

)else lump[bel[n]

= bel[x]].

insert

(val[n]

= v);}

return;}

intmain

(void

)for

(register

int i=

1;i<=n;

++i)

scanf

("%d"

, val+i)

;dfs(1

,0);

scanf

("%d"

,&q)

;while

(q --

)work()

;return0;

}

BZOJ3720 Gty的妹子樹(樹上分塊)

我是超連結 樹上分塊,以一種新的姿勢寫的,似乎優越?對於分塊我們只需一遍dfs,只要當前節點的父節點的塊的大小大於sqrt n 就自成一塊 我們記錄每個節點所屬的塊,建立兩個圖,乙個圖存原樹,乙個圖存塊的連通性 我們維護塊內的元素有序,這樣查詢時可以二分 因為我們是根據父節點來分塊的,所以不會有 遙...

Gty的妹子樹

我曾在弦歌之中聽過你,檀板聲碎,半出折子戲。舞榭歌台被風吹去,歲月深處尚有餘音一縷 gty神 xian 犇 chong 從來不缺妹子 他來到了一棵妹子樹下,發現每個妹子有乙個美麗度 由於gty很哲 學,他只對美麗度大於某個值的妹子感興趣。他想知道某個子樹中美麗度大於k的妹子個數。某個妹子的美麗度可能...

bzoj3720 Gty的妹子樹 樹分塊

題目鏈結 題解 按dfs序樹分塊的模板題。每個節點的子樹在dfs序中一定為一串連續的區間,那我們對dfs序分塊就行了,每個塊內元素按大小排序。查詢時暴力找邊界上的塊,中間的塊二分一下。修改時暴力維護大小順序,插入時插在它的父親後 dfs序為它的父親 1 然後暴力修改當前塊的dfs序。複雜度o n n...