由於零食被頻繁的消耗和補充,零食機的價值v會時常發生變化。小度熊只能從編號為0的零食機出發,並且每個零食機至多經過一次。另外,小度熊會對某個零食機的零食有所偏愛,要求路線上必須有那個零食機。
為小度熊規劃乙個路線,使得路線上的價值總和最大。
輸入資料第一行是乙個整數t(t≤10),表示有t組測試資料。
對於每組資料,包含兩個整數n,m(1≤n,m≤100000),表示有n個零食機,m次操作。
接下來n−1行,每行兩個整數x和y(0≤x,y接下來一行由n個數組成,表示從編號為0到編號為n−1的零食機的初始價值v(|v|<100000)。
接下來m行,有兩種操作:0 x y,表示編號為x的零食機的價值變為y;1 x,表示詢問從編號為0的零食機出發,必須經過編號為x零食機的路線中,價值總和的最大值。
本題可能棧溢位,辛苦同學們提交語言選擇c++,並在**的第一行加上:
#pragma comment(linker, "/stack:1024000000,1024000000")
對於每組資料,首先輸出一行」case #?:」,在問號處應填入當前資料的組數,組數從1開始計算。
對於每次詢問,輸出從編號為0的零食機出發,必須經過編號為x零食機的路線中,價值總和的最大值。
16 5
0 11 2
0 33 4
5 37 -5 100 20 -5 -7
1 11 3
0 2 -1
1 11 5
case #1:
10227220
通過dfs序建立線段樹,線段樹維護樹上各節點到0節點的距離,更新時通過節點dfs序兩個編號進行區間更新(自己及子節點更新)。
#include
using
namespace std;
const
long
long inf =
1e18
;const
int maxn =
1e5+5;
// 鏈式前向星
struct link
;link edges[maxn <<1]
;int head[maxn]
;int tot =0;
int t;
int n, m;
long
long weight[maxn]
;void
init()
void
addedge
(int u,
int v)
; head[u]
= tot;
edges[
++tot]
= link
; head[v]
= tot;
}// dfs序
int cnt;
int inindex[maxn]
, outindex[maxn]
;int element[maxn]
;long
long dis[maxn]
;void
dfs(
int u,
int pre)
} outindex[u]
= cnt;
}// 線段樹
long
long max[maxn <<2]
, lazy[maxn <<2]
;void
pushup
(int root)
void
pushdown
(int root)
}void
build
(int left,
int right,
int root)
int mid =
(left + right)
>>1;
build
(left, mid, root <<1)
;build
(mid +
1, right, root <<1|
1);pushup
(root);}
void
intervalupdate
(int operateleft,
int operateright,
int value,
int left,
int right,
int root)
int mid =
(left + right)
>>1;
pushdown
(root);if
(operateleft <= mid)
if(operateright > mid)
pushup
(root);}
long
long
query
(int operateleft,
int operateright,
int left,
int right,
int root)
int mid =
(left + right)
>>1;
pushdown
(root)
;long
long ans =
-inf;
if(operateleft <= mid)
if(operateright > mid)
return ans;
}int
main
(int argc,
char
*argv)
for(
int i =
0; i < n;
++i)
dis[0]
= weight[0]
; cnt =0;
dfs(0,
-1);
build(1
, n,1)
;printf
("case #%d:\n"
, case)
;for
(int operation =
1, operate, x, y; operation <= m;
++operation)
else}}
return0;
}
HDU 5692 Snacks dfs序 線段樹
會時常發生變化。小度熊只能從編號為0的零食機出發,並且每個零食機至多經過一次。另外,小度熊會對某個零食機的零食有所偏愛,要求路線上必須有那個零食機。為小度熊規劃乙個路線,使得路線上的價值總和最大。input 輸入資料第一行是乙個整數t t 10 表示有t組測試資料。對於每組資料,包含兩個整數n,m ...
hdu5692 dfs序線段樹
這是補的知識點,按先序遍歷的順序建立dfs序,用左右兩個值代表整個區間,因為dfs序最重要的特點就是子樹的區間是連續的 建立線段樹時,需要用重新標過的 下標來建立 pragma comment linker,stack 1024000000,1024000000 include include in...
hdu5692 Snacks 線段樹 dfs序
我們維護每個點到根的權值和。詢問過x的路徑中權值最大的,即詢問x的子樹中到根的距離最大的。修改x為y,則x的子樹中的所有點到根的距離都加上了y a x 顯然可以用dfn變成連續區間用線段樹來維護。pragma comment linker,stack 1024000000,1024000000 in...