我們維護每個點到根的權值和。詢問過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 ...