Tree HDU 6394(樹上分塊,倍增)

2021-09-28 14:06:42 字數 1597 閱讀 9159

給定乙個樹,每個節點有個能量值代表可以往上跳的節點的個數。然後兩種操作乙個是查詢結點跳出樹的步數,乙個是修改能量值

可以對樹進行分塊。詳細看**注釋

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn =

1e5+

100;

int n, head[maxn]

, to[maxn]

, nxt[maxn]

, tot;

void

addedge

(int u,

int v)

int en[maxn]

, b, enl[maxn]

;int fa[maxn][20

], bel[maxn]

, top, st[maxn]

, cur;

int next[maxn]

, ti[maxn]

;/*分塊操作*/

void

dfs(

int u)

} st[top++

]= u;

}/*倍增往上跳跳跳*/

intjump

(int u,

int lev)

return u;

}void

update

(int u)

else

}vector<

int> fbel[maxn]

;void

dfs0

(int u)

}inline

void

init()

}// 算出每個點可以直接跳到的點

for(

int i =

1; i <= n; i++

)// 自頂向下遍歷

dfs0(1

);}inline

intquery

(int u)

return ret;

}char buf[

(int

)2e7];

int idx=0;

void

read

(int

& x)

intmain()

for(

int i =

1; i <= n; i++

)read

(en[i]);

init()

;int q;

read

(q);

while

(q--

)else}}

}return0;

}/*14

1 2 3

1 1 1 1

31 4

2 3 2

1 4*/

HDU 6394 Tree(樹分塊 倍增)

給出一棵樹,然後每個節點有乙個權值,代表這個點可以往上面跳多遠,問最少需要多少次可以跳出這顆樹 先dfs一次得到dfs序,然後按dfs序分塊。倍增計算從某點跳x到哪個點,用cn儲存它跳出這一塊需要的次數,ne儲存跳出這塊會去的點。然後塊內就暴力修改了。複雜度nsqrt n include inclu...

樹上分塊 Gty的妹子樹

我們需要查詢樹上問題資訊,考慮樹上分塊。我們可以把樹分成大小為n sqrt n n 的若干個連通塊。每乙個塊內用結構體記錄,支援修改操作,插入操作和查詢操作。現在我們考慮如何實現下面三個操作 照樣每一次操作的時間複雜度是o n o sqrt n o n 的。對於詢問x子樹的答案,我們可以根據分塊特性...

SCOI 2005 王室聯邦 樹上分塊?

在wzh大神 ps 我是渣渣wzh 的部落格看見的乙個分塊題目,剛好要複習分塊,於是我就研究了一下樹上分塊,恩,這個題目的要求和樹上分塊差不多。沒什麼就是原來的size變成題目規定的b了,然後這就變成了分塊的模板題目。bzoj 大神wzh的部落格orzwzh description 餘 人國的國王想...