hdu5692 Snacks 線段樹 dfs序

2021-08-08 17:53:20 字數 1220 閱讀 9589

我們維護每個點到根的權值和。詢問過x的路徑中權值最大的,即詢問x的子樹中到根的距離最大的。修改x為y,則x的子樹中的所有點到根的距離都加上了y-a[x]。顯然可以用dfn變成連續區間用線段樹來維護。

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

#include

#include

#include

using

namespace

std;

#define ll long long

#define inf 1ll<<63

#define n 100010

inline

int read()

while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();

return x*f;

}int tst,n,m,h[n],num=0,in[n],out[n],a[n],dfn,id[n];

ll d[n];

struct edgedata[n<<1];

struct nodetree[n<<2];

void dfs(int x)

out[x]=dfn;

}inline

void pushup(int p)

inline

void pushdown(int p)

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

int mid=l+r>>1;

build(p<<1,l,mid);build(p<<1|1,mid+1,r);

pushup(p);

}void add(int p,int l,int r,int x,int y,int val)

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

if(x<=mid) add(p<<1,l,mid,x,y,val);

if(y>mid) add(p<<1|1,mid+1,r,x,y,val);

pushup(p);

}ll qmax(int p,int l,int r,int x,int y)

int main()

for(int i=0;i0]=a[0];dfs(0);build(1,1,n);

while(m--)}}

return

0;}

HDU 5692 Snacks 百度之星2A

題意就是根節點到 i 子樹上所有點的最大值,並且這棵樹上的點權可修改。那麼維護所有點到根的和,如果修改乙個 u節點,只會改變根到 u 子樹上點的和。把樹用df s序遍歷一下,把樹變成乙個序列,修改節點就變成了序列的區間修改,找最大值也變成了區間找最值。一棵線段樹搞定了。複雜度 o mlog n pr...

HDU 5692 Snacks dfs序 線段樹

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

HDU 5692 Snacks dfs序 線段樹

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