HDU 5692 Snacks dfs序 線段樹

2021-09-25 23:58:39 字數 2142 閱讀 3315

會時常發生變化。小度熊只能從編號為0的零食機出發,並且每個零食機至多經過一次。另外,小度熊會對某個零食機的零食有所偏愛,要求路線上必須有那個零食機。

為小度熊規劃乙個路線,使得路線上的價值總和最大。

input

輸入資料第一行是乙個整數t(t≤10)

,表示有t組測試資料。

對於每組資料,包含兩個整數n,m(1≤n,m≤100000),表示有n個零食機,m次操作。

接下來n−1行,每行兩個整數x和y(0≤x,y零食機的路線中,價值總和的最大值。

本題可能棧溢位,辛苦同學們提交語言選擇c++,並在**的第一行加上:

`#pragma comment(linker, "/stack:1024000000,1024000000") `

output

對於每組資料,首先輸出一行」case #?:」,在問號處應填入當前資料的組數,組數從1開始計算。

對於每次詢問,輸出從編號為0的零食機出發,必須經過編號為x

零食機的路線中,價值總和的最大值。

sample input

1

6 50 1

1 20 3

3 45 3

7 -5 100 20 -5 -7

1 11 3

0 2 -1

1 11 5

sample output

case #1:

10227

220

思路:如果記錄每個點到根節點的點權之和的話,那麼修改乙個點的點權就相當於同時修改該子樹的點權,查詢從根節點出發經過點v的路徑的最大點權和就相當於查詢點v的子樹中所有節點中維護的值最大的那個。其實就是區間修改+區間查詢。用dfs序解決區間問題。

#pragma comment(linker, "/stack:1024000000,1024000000")

#include#include#includeusing namespace std;

typedef long long ll;

const int maxn=1e5+5;

struct node

tree[maxn<<2];

struct edge

edge[maxn<<1];

int n,m,cnt=0,tot=0;

int in[maxn];

int out[maxn];

ll dis[maxn];

ll dist[maxn];

int head[maxn];

ll a[maxn];

inline void addedge(int u,int v)

void dfs(int u,int fa)

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

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

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

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

tree[i].max=max(tree[i<<1].max,tree[i<<1|1].max);

}inline void down(int i)

void update(int i,int l,int r,ll v)

if(tree[i].lazy)

down(i);

int mid=(tree[i].l+tree[i].r)>>1;

if(r<=mid)

update(i<<1,l,r,v);

else if(l>mid)

update(i<<1|1,l,r,v);

else

update(i<<1,l,mid,v),

update(i<<1|1,mid+1,r,v);

tree[i].max=max(tree[i<<1].max,tree[i<<1|1].max);

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

inline void prework()

for(int i=1;i<=n;i++)

scanf("%lld",&a[i]);

dfs(1,0);

build(1,1,n);

}inline void mainwork()

else

}}int main()

}

HDU 5692 Snacks dfs序 線段樹

由於零食被頻繁的消耗和補充,零食機的價值v會時常發生變化。小度熊只能從編號為0的零食機出發,並且每個零食機至多經過一次。另外,小度熊會對某個零食機的零食有所偏愛,要求路線上必須有那個零食機。為小度熊規劃乙個路線,使得路線上的價值總和最大。輸入資料第一行是乙個整數t t 10 表示有t組測試資料。對於...

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...