我們需要查詢樹上問題資訊,考慮樹上分塊。
我們可以把樹分成大小為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...