國家集訓隊 旅遊

2021-10-05 02:25:22 字數 3804 閱讀 8691

題目背景

ray 樂忠於旅遊,這次他來到了 t 城。t 城是乙個水上城市,一共有 nn 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說, t 城中只有 n-1n−1 座橋。

ray 發現,有些橋上可以看到美麗的景色,讓人心情愉悅,但有些橋狹窄泥濘,令人煩躁。於是,他給每座橋定義乙個愉悅度 ww,也就是說,ray 經過這座橋會增加 ww 的愉悅度,這或許是正的也可能是負的。有時,ray 看待同一座橋的心情也會發生改變。

現在,ray 想讓你幫他計算從 uu 景點到 vv 景點能獲得的總愉悅度。有時,他還想知道某段路上最美麗的橋所提供的最大愉悅度,或是某段路上最糟糕的一座橋提供的最低愉悅度。

題目描述

給定一棵 nn 個節點的樹,邊帶權,編號 0 \sim n-10∼n−1,需要支援五種操作:

c i w 將輸入的第 ii 條邊權值改為 ww

n u v 將 u,vu,v 節點之間的邊權都變為相反數

sum u v 詢問 u,vu,v 節點之間邊權和

max u v 詢問 u,vu,v 節點之間邊權最大值

min u v 詢問 u,vu,v 節點之間邊權最小值

保證任意時刻所有邊的權值都在 [-1000,1000][−1000,1000] 內。

輸入格式

第一行乙個正整數 nn,表示節點個數。

接下來 n-1n−1 行,每行三個整數 u,v,wu,v,w,表示 u,vu,v 之間有一條權值為 ww 的邊,描述這棵樹。

然後一行乙個正整數 mm,表示運算元。

接下來 mm 行,每行表示乙個操作。

輸出格式

對於每乙個詢問操作,輸出一行乙個整數表示答案。

輸入輸出樣例

輸入 #1 複製

30 1 1

1 2 2

8sum 0 2

max 0 2

n 0 1

sum 0 2

min 0 2

c 1 3

sum 0 2

max 0 2

輸出 #1 複製32

1-153

說明/提示

【資料範圍】

對於 100%100% 的資料,1\le n,m \le 2\times 10^51≤n,m≤2×105。

2020.02.04 修正了一點資料的錯誤

2020.03.14 加入了一組 hack 資料

我們可以對於線段樹的每乙個節點,維護單點修改,區間取反,區間求和,區間最值。

分別維護一下就好了

好毒瘤啊,調了好久

#include

using

namespace std;

struct ede[

50000];

int tr[

100000][

3],neg[

100000];

int n,m,xx,yy,x[

40000

],y[

40000

],w[

40000

],st,numb,fir[

30000

],a[

30000];

int d[

30000

],size[

30000

],f[

30000

],wu[

30000

],top[

33000

],son[

30000

],id[

30000];

string s;

void

add(

int x,

int y,

int w)

void

dfs1

(int u,

int fa,

int w)

}void

dfs2

(int u,

int to,

int w)

}void

pushup

(int o)

void

pushdown

(int o,

int l,

int r)

void

build

(int o,

int l,

int r)

int mid=

(l+r)/2

;build

(o*2

,l,mid)

;build

(o*2+1

,mid+

1,r)

;pushup

(o);

}void

change

(int o,

int l,

int r,

int x,

int w)

if(l>x||rreturn

;int mid=

(l+r)/2

;if(neg[o]

)pushdown

(o,l,r)

;change

(o*2

,l,mid,x,w)

;change

(o*2+1

,mid+

1,r,x,w)

;pushup

(o);

}void

negat

(int o,

int l,

int r,

int x,

int y)

if(l>y||rreturn

;int mid=

(l+r)/2

;if(neg[o]

)pushdown

(o,l,r)

;negat

(o*2

,l,mid,x,y)

;negat

(o*2+1

,mid+

1,r,x,y)

;pushup

(o);

}int

sum(

int o,

int l,

int r,

int x,

int y)

intmaa

(int o,

int l,

int r,

int x,

int y)

intmii

(int o,

int l,

int r,

int x,

int y)

intquery

(int x,

int y,

int p)

if(d[x]

>d[y]

)swap

(x,y);if

(p==

2) ans=

max(ans,

maa(1,

1,n,id[x]+1

,id[y]))

;if(p==

3) ans=

min(ans,

mii(1,

1,n,id[x]+1

,id[y]))

;return ans;

}void

add1

(int x,

int y)

if(d[x]

)swap

(x,y)

;negat(1

,1,n,id[y]+1

,id[x]);

}int

main()

}return0;

}

國家集訓隊 旅遊

ray 樂忠於旅遊,這次他來到了 t 城。t 城是乙個水上城市,一共有 n 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有 n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人心情愉悅,但有些橋狹...

國家集訓隊 旅遊

link 很簡單一道題,評紫實在是有點暴殄天物。邊權下放到點權然後查詢時注意不要查詢lca的值即可。本來以為在區間取反的基礎上還有個區間加所以雙lazy還有點麻煩時,突然發現它似乎只有單點修改。唯一不好的事就是我把樹剖的板子打錯了。應該判的是top的深度大小,然後我 竟然把這茬給忘了。於是調了兩個小...

luogu P1505 國家集訓隊 旅遊

題面傳送門 第一次一遍過國集紫題。好激動。一看就是樹剖,只不過操作有點多。把每條邊的權值放在兒子節點即可。對於取相反數放懶標記即可。其他是樹剖正常操作。實現 include include define max a,b a b a b define min a,b a b a b using nam...