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

2021-07-05 00:03:19 字數 2306 閱讀 7284

link:

problem 2082 過路費

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

有多組樣例,每組樣例第一行輸入兩個正整數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最少要花多少過路費。

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

2 31 2 1

1 1 2

0 1 2

1 2 1 1

2foj有獎月賽-2023年4月(校賽熱身賽)

ac code:

#include#include#includeconst int n=10015;

using namespace std;

int head[n], to[n << 1], next1[n << 1], tot;//邊資訊

int top[n]; //top[v]=u表示點v,u在乙個鏈中,且u是這個鏈深度最小的點(即頂端)

int fath[n]; //記錄父節點

int deep[n]; //每個點在樹上的深度

int num[n]; //每棵子樹的節點個數

int son[n]; //選的重邊子節點

int pos; //線段樹葉子結點總數

void addedge(const int& u, const int& v)

void addundiredge(const int& u, const int& v)

void init(int n)

void dfs1(int u,int pre,int d)//第一遍dfs求出fath,deep,num,son

}void getpos(int u,int root)}

//線段樹

struct tree

root[n*4];

int val[n];//權值

int max(int a,int b)

void build(int l,int r,int k)//建樹,範圍為l~r,k為根節點的線段樹。 build(1,pos,1);

build(l,mid,k<<1);

build(mid+1,r,k<<1|1);

root[k].sum=root[k<<1].sum+root[k<<1|1].sum;

root[k].maxv=max(root[k<<1].maxv,root[k<<1|1].maxv);

}void upson(int k,int l,int r)//更新兒子

if(root[k].addc)

}void updata1(int l,int r,int k,const int l,const int r,int c)//從範圍為1(l)~pos(r),根節點為1(k)的線段樹中更新 成段更新的區間位置為(l,r)的元素值為c

int mid=(l+r)/2;

upson(k,l,r);

if(l<=mid)

updata1(l,mid,k<<1,l,r,c);

if(midv路徑上節點的權值的和全域性變數sum)、u->v路徑上節點的最大權值(全域性變數maxv)

void operat1(int u,int v,int c)//表示從u點到v點的路徑的每條邊權都變成c

void operat2(int u,int v,int c)//表示從u點到v點的路徑的每條邊權都加上c

struct edg

edg[n];

int main()

build(1,pos,1);

while(q--)

else if(op==0)

updata1(1,pos,1,p[edg[a].v],p[edg[a].v],b);//從範圍為1~pos,根節點為1的線段樹中更新原先按順序輸入時的第a條邊,將該邊權值改為b //也就是單點更新(其對應線段樹成段更新的區間位置為(p[edg[a].v],p[edg[a].v]))

/*else*/}

}}

fzu 2082 過路費(樹鏈剖分)

思路 樹鏈剖分的裸題了 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 to...

解題報告 FZU 2082 過路費 樹剖

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

FZU2082 過路費 樹鏈剖分線段樹

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