給定乙個樹,每個節點有個能量值代表可以往上跳的節點的個數。然後兩種操作乙個是查詢結點跳出樹的步數,乙個是修改能量值
可以對樹進行分塊。詳細看**注釋
#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 餘 人國的國王想...