題意:給定乙個樹形圖,某人原來在 s 點,每條邊(路)有通過的時間花費,有兩種操作:1. 查詢某人到 u 點花費的時間 2. 更新某條路的時間花費。
解題思路:前面樹鏈剖分練得一直是點權,但一遇邊權懵逼了。下裡面的**是從點權改過來的。其實邊權和點權是差不多的。大致意思就是,取每條邊連個點中,處於下位的(更深)點來記錄這條邊的值。有一些查詢時的細節和點權稍有不同,詳見**注釋。
#include#include#include#include#pragma comment(linker, "/stack:102400000,102400000")
#define n 100050
using namespace std;
struct node
s[2*n];
struct edge
e[n];
struct tree
p[3*n];
int w[n],head[n],cnt,fa[n],siz[n],son[n],dep[n],top[n],id[n];
void add_edge(int u,int v)
void dfs1(int u,int f,int deep) }}
void dfs2(int u,int t)
}void build(int rt,int l,int r)
int query(int rt,int l,int r)
int mid=(p[rt].l+p[rt].r)/2;
if(r<=mid)
else
if(l>=mid+1)
else }
void update(int rt,int l,int r,int kk)
int mid=(p[rt].l+p[rt].r)/2;
if(r<=mid)
else
if(l>=mid+1)
else
p[rt].w=(p[2*rt].w+p[2*rt+1].w);
}long long qrange(int u,int v)
void uprange(int u,int v,int k)
int main()
else
}return 0;
}
POJ 2763 樹鏈剖分 邊修改 邊查詢)
解題思路 樹鏈剖分基礎題。每次q之後改變一下s。線段樹記錄的是邊權。方法是對於一條邊 u,v 邊權值加在dep比較大的那一端。鏈查詢 邊 和 鏈查詢 點 在輕鏈時略有不同。注意本題使用vector鄰接表存圖是會tle的,應該使用鏈式前向星。樹鏈剖分中使用鏈式前向星是基本要求。include cstd...
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...
POJ3237 Tree 樹鏈剖分 邊權
傳送門 n個點的,n 1條邊 修改單邊邊權 將a b的邊權取反 查詢a b邊權最大值 修改邊權就查詢點的深度大的點,用大的點去存這條邊的邊權,其餘的就和點權的是一樣的了 取反操作用線段樹維護,區間最大值取反就是區間最小值,區間最小值取反就是區間最大值 所以維護兩顆線段樹即可,lazy標記表示覆蓋單邊...