POJ 2763 樹鏈剖分 邊修改 邊查詢)

2021-09-08 10:27:16 字數 1728 閱讀 3784

解題思路

樹鏈剖分基礎題。每次q之後改變一下s。

線段樹記錄的是邊權。方法是對於一條邊(u,v),邊權值加在dep比較大的那一端。

鏈查詢(邊)和 鏈查詢(點)在輕鏈時略有不同。

注意本題使用vector鄰接表存圖是會tle的,應該使用鏈式前向星。樹鏈剖分中使用鏈式前向星是基本要求。

#include "

cstdio

"#include

"cstring

"using

namespace

std;

#define maxn 100005

ints[maxn],dep[maxn],w[maxn],fa[maxn],top[maxn],son[maxn],val[maxn],cnt,tol,n;

inthead[maxn];

struct

edge

edge[maxn];

struct

edge

e[2*maxn];

void addedge(int u,int

v)void dfs1(int u,int pre,intd)}

void dfs2(int u,int

tp)}

//segment tree

#define lson l,mid,root<<1

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

int sum[maxn<<2

];void pushup(int

root)

void build(int l,int r,int

root)

int mid=(l+r)>>1

; build(lson);

build(rson);

pushup(root);

}void update(int p,int v,int l,int r,int

root)

int mid=(l+r)>>1

;

if(p<=mid) update(p,v,lson);

else

update(p,v,rson);

pushup(root);

}int query(int l,int r,int l,int r,int

root)

void change(int x,int

v)int query(int x,int

y)

if(dep[x]>dep[y]) swap(x,y);

if(x!=y) ans+=query(w[son[x]],w[y],1,n,1);//

return

ans;

}int

main()

dfs1(

1,1,1

); dfs2(

1,1);

for(int i=1;i)

build(

1,n,1

);

while(m--)

if(cmd==1

) }}

}

13493821

neopenx

2763

accepted

9676k

1579ms

c++3176b

2014-10-01 16:16:22

POJ2763 樹鏈剖分,邊權,模板)

題意 給定乙個樹形圖,某人原來在 s 點,每條邊 路 有通過的時間花費,有兩種操作 1.查詢某人到 u 點花費的時間 2.更新某條路的時間花費。解題思路 前面樹鏈剖分練得一直是點權,但一遇邊權懵逼了。下裡面的 是從點權改過來的。其實邊權和點權是差不多的。大致意思就是,取每條邊連個點中,處於下位的 更...

poj 2763(樹鏈剖分維護邊權模版題)

time limit 4000ms memory limit 65536k total submissions 16709 accepted 4561 description input output for each message a,print an integer x,the time re...

POJ 2763 樹鏈剖分 線段樹維護區間和

這題是我第一次自己查錯並且a掉的樹剖模板題。思路很簡單,樹剖後扔到線段樹里就行了。唯一困難點的是 1.題目給的是邊權值,要轉為點值,那麼直接把值賦給連線邊的兩點中深度較大的一點 2.修改時,是給編號修改,為了方便,我直接開的幾個陣列來裝邊上的資訊 查了半天錯,結果是線段樹打錯了個字母。ac 如下 i...