解題思路:
樹鏈剖分基礎題。每次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...