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

2021-09-25 15:25:37 字數 2303 閱讀 2732

time limit:4000ms

memory limit:65536k

total submissions:16709

accepted:4561

description

input

output

for each message a, print an integer x, the time required to take the next child.

sample input

3 3 1

1 2 1

2 3 2

0 21 2 3

0 3

sample output

1

3

題意:給一棵樹,樹的邊有邊權。有兩種操作,詢問乙個位置到另乙個位置的路徑長度,或是更改第 i 條邊的邊權。

思路:樹剖邊權模版題。。   相對於點權,是把邊權放在  深度較深的那個點,然後跑點權的樹剖,唯一不同的是,在利用重鏈的函式裡面,在最後的時候需要先判斷 x 與 y 是否是同一點,然後把 深度淺的那個點移向他的重兒子。

code:

#include#include#include#define debug(x) cout << "[" << #x <<": " << (x) <<"]"<< endl

#define pii pair#define clr(a,b) memset((a),b,sizeof(a))

#define rep(i,a,b) for(int i = a;i < b;i ++)

#define pb push_back

#define mp make_pair

#define ll long long

#define ull unsigned ll

#define ls i << 1

#define rs (i << 1) + 1

#define int(t) int t; scanf("%d",&t)

using namespace std;

const int maxn = 1e6 + 10;

int head[maxn],cnt = 0;

struct xx;

}edge[maxn << 1];

int hson[maxn],dep[maxn],size[maxn];

int fa[maxn],dfsx[maxn],rk[maxn];

int top[maxn],val[maxn];

///先dfs1,再dfs2, 如根節點為 r, 則 dfs1(r,0); dfs2(r,r);

void dfs1(int p,int f)

}int xu = 0;

void dfs2(int p,int tp)

}ll sum[maxn << 2];

ll query(int i,int l,int r,int ql,int qr)

ll ans = 0;

int mid = (l + r) >> 1;

if(ql <= mid) ans += query(ls,l,mid,ql,qr);

if(qr > mid) ans += query(rs,mid + 1,r,ql,qr);

return ans;

}ll allquery(int x,int y)

if(x == y) return ans;

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

ans += query(1,1,xu,rk[hson[x]],rk[y]);

return ans;

}void update(int i,int l,int r,int pos,int val)

int mid = (l + r) >> 1;

if(pos <= mid) update(ls,l,mid,pos,val);

if(pos > mid) update(rs,mid + 1,r,pos,val);

sum[i] = sum[ls] + sum[rs];

}void init(int n)

int main()

dfs1(s,0); dfs2(s,s);

for(int i = 1;i < cnt;++ i)

while(q --)

else }}

return 0;

}

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

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

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

解題思路 樹鏈剖分基礎題。每次q之後改變一下s。線段樹記錄的是邊權。方法是對於一條邊 u,v 邊權值加在dep比較大的那一端。鏈查詢 邊 和 鏈查詢 點 在輕鏈時略有不同。注意本題使用vector鄰接表存圖是會tle的,應該使用鏈式前向星。樹鏈剖分中使用鏈式前向星是基本要求。include cstd...

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

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