(LCA 樹上主席樹)FZU 2237 中位數

2022-01-29 03:00:50 字數 2445 閱讀 1307

題意:

多次查詢乙個樹鏈上的中位數(其實就是求k大)。

分析:

感覺莫隊可做,只是不會樹上莫隊。。

而且這裡是邊權,處理起來貌似有點小麻煩。。

後來發現其實貌似是乙個很老的題,,kuangbin模板書上有類似的題。

樹鏈上的第k大數,這是一道可以用主席樹解的題,複雜度才nlogn。

這裡也是這樣先求從根到每個點的線段樹,以為樹存在父子關係,所有可以從讓下層繼承上層的線段樹,非常符合主席樹的可持久化思想。

然後在查詢第k大的時候,去掉重複部分,就可以查了。

太強了,,,

**:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 

7 #include 8 #include 9 #include 10 #include 11 #include 12 #include

13 #include 14 #include 15

16using

namespace

std;

1718 typedef long

long

ll;19 typedef unsigned long

long

ull;

20#define inf (0x3f3f3f3f)

21#define lnf (0x3f3f3f3f3f3f3f3f)

22#define eps (1e-8)

23int sgn(double

a) 26

27int

n, q;

28const

int maxn = 50010;29

const

int m = 100001;30

struct

node ;

3334 vectorg[maxn];

35const

int deg = 16;36

intfa[maxn][deg];

37int

deg[maxn];

3839

void addedge(int u, int v, int

w) 48

49void bfs(int

root)

60for(int i = 0; i < (int)g[tmp].size(); i++) 67}

68}6970

int lca(int u, int

v) 75

if(u == v)return

u;76

for(int i = deg - 1; i >= 0; i--) 81}

82return fa[u][0

];83}84

8586

8788

int t[maxn], lson[maxn * 30], rson[maxn * 30

];89

int c[maxn * 30

];90

int tot = 0;91

92int build(int l, int

r) 100

return

root;

101}

102103

104int update(int root, int pos, int

val) else

123 c[newroot] = c[root] +val;

124}

125return

tmp;

126}

127128

int query(int u_root, int v_root, int fa_root, int

k) else

144}

145return

l;146

}147

148149

150void dfs(int u, int par, int

val)

157}

158159

160void

init()

164 tot = 0

;165 memset(fa, 0, sizeof

(fa));

166}

167168

void

solve()

178 bfs(1

);179 t[0] = build(1

, m);

180 dfs(1, 0, 1

);181

while(q--)

188189

}190

191}

192193

194195

intmain()

SPOJ COT 樹上第K大 LCA 主席樹

這題和普通的第k大類似。普通的第k大,是從後往前建立主席樹,前乙個在後乙個的基礎上修改。而樹上第k大,依舊是每個結點一棵主席樹,是在父節點的基礎上修改。那麼可以發現這棵主席樹是包括所有祖先結點的 就是深度在當前結點之上的 查詢的時候,是兩個結點的值的和,還要減掉lca以上的部分。同時要注意處理lca...

可修改主席樹 樹上可修改主席樹 樹套樹套樹

題目 思路 其實樹上主席樹是把每一棵主席樹看做樹狀陣列上的乙個點,每次修改log棵主席樹,求區間和的時候同樣log查詢字首和。上 include define d while d isdigit ch getchar using namespace std const int n 2e4 5 int...

關於樹論 LCA樹上倍增演算法

補了一發lca,表示這東西表面上好像簡單,但是細節真挺多。我學的是樹上倍增,倍增思想很有趣 爸爸的爸爸叫奶奶.偶不,爺爺 有乙個跟st表非常類似的東西,f i j 表示j的第2 i的祖先,就是說f 0 x 是父親,f 1 x 是爺爺,f 2 x 是高祖父 爺爺的爺爺 f 3 x 是遠祖父 高祖父的高...