fzu 2082 過路費(樹鏈剖分)

2021-07-12 01:54:59 字數 1284 閱讀 7247

思路:樹鏈剖分的裸題了

#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],top[maxn],id[maxn];

int tot;

int val[maxn];

vectore[maxn];

int n,m;

struct node

nodes[maxn];

ll sum[maxn<<2];

#define lson i*2,l,m

#define rson i*2+1,m+1,r

void push_up(int i)

void build(int i,int l,int r)

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

build(lson);

build(rson);

push_up(i);

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

void dfs1(int u,int f,int d)

int main()

{ while(scanf("%d%d",&n,&m)!=eof)

{ for(int i = 0;i<=n;i++)

e[i].clear();

for(int i = 1;i

description

有n座城市,由n-1條路相連通,使得任意兩座城市之間可達。每條路有過路費,要交過路費才能通過。每條路的過路費經常會更新,現問你,當前情況下,從城市a到城市b最少要花多少過路費。

input

有多組樣例,每組樣例第一行輸入兩個正整數n,m(2 <= n<=50000,1<=m <= 50000),接下來n-1行,每行3個正整數a b c,(1 <= a,b <= n , a != b , 1 <= c <= 1000000000).資料保證給的路使得任意兩座城市互相可達。接下來輸入m行,表示m個操作,操作有兩種:一. 0 a b,表示更新第a條路的過路費為b,1 <= a <= n-1 ; 二. 1 a b , 表示詢問a到b最少要花多少過路費。

output

對於每個詢問,輸出一行,表示最少要花的過路費。

sample input

2 31 2 11 1 20 1 21 2 1

sample output

12

解題報告 FZU 2082 過路費 樹剖

比較裸的樹剖,但是給的是邊權,這時候就要把每條邊的邊權下放到深度相對更深的點中。然後正常樹剖操作。單點修改就改對應邊深度深的那個點的點權,區間查詢需要判斷下 首先還是正常重邊上查詢,然後最後兩點在同一條重邊後,如果這兩個點相同的話就不用再查詢這個點的點權了,因為我們要看的實際是邊,如果不同就要少算那...

FZU2082 過路費 樹鏈剖分線段樹

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

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

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