FZU 2082 樹鏈剖分模板題

2021-07-10 23:48:15 字數 1231 閱讀 5439

一顆樹邊上的權在變動,動態求兩點之間的和。

#include #include #include #include #include #include #include #include #include using namespace std;

#define ll long long

#define pi acos(-1.0)

//#pragma comment(linker, "/stack:1024000000")

const int mod=1e9+7;

const int inf=0x3f3f3f3f;

const double eqs=1e-3;

const int maxn=50000+10;

#define root 1, tot, 1

#define lson l, mid, rt<<1

#define rson mid+1, r, rt<<1|1

int head[maxn], cnt, tot;

int siz[maxn], top[maxn], fa[maxn], w[maxn], son[maxn], dep[maxn];

int sum[maxn<<2];

struct node

edge[maxn<<1];

void add(int u,int v, int w)

void init()

//第一次dfs任務完成統計

//每棵子樹大小siz

//節點深度dep

//重孩子(siz最大的孩子編號)son,

//u初始值為樹根,p為父節點

void dfs1(int u, int p)

int query(int ll, int rr, int l, int r, int rt)

int mid=l+r>>1, ans=0;

if(ll<=mid) ans+=query(ll,rr,lson);

if(rr>mid) ans+=query(ll,rr,rson);

return ans;

}}lt;

//從兩個點相互爬公升,完成對路徑的分割

//v -----> top[v] --> fa[top[v]]

int solve(int u, int v)

{ int f1=top[u], f2=top[v], ans=0;

while(f1!=f2){

if(dep[f1]

fzu 2082 過路費(樹鏈剖分)

思路 樹鏈剖分的裸題了 include include include include define ll long long using namespace std const int maxn 50000 100 int siz maxn fa maxn son maxn dep maxn to...

FZU 2082 過路費(邊剖分模板題)

link problem 2082 過路費 有n座城市,由n 1條路相連通,使得任意兩座城市之間可達。每條路有過路費,要交過路費才能通過。每條路的過路費經常會更新,現問你,當前情況下,從城市a到城市b最少要花多少過路費。有多組樣例,每組樣例第一行輸入兩個正整數n,m 2 n 50000,1 m 50...

FZU2082 過路費 樹鏈剖分線段樹

如果只是查詢沒有修改就好做了,只需要找lca。加上修改操作之後可以使用樹鏈剖分 線段樹,注意把邊權下放到點權,因此需要特別注意 當我們執行lca操作時,如果u v那麼直接返回路徑長度 如果u v,則說明此時uv 假設dep u dep v 在一條重鏈上,返回的路徑長度還需要加上dis u,son v...