HDU 5692 Snacks dfs序 線段樹

2021-08-28 11:34:14 字數 3138 閱讀 7543

由於零食被頻繁的消耗和補充,零食機的價值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...