P4315 月下「毛景樹」

2022-05-03 13:33:20 字數 3761 閱讀 9138

毛毛蟲經過及時的變形,最終逃過的一劫,離開了菜媽的菜園。 毛毛蟲經過千山萬水,歷盡千辛萬苦,最後來到了小小的紹興一中的校園裡。

爬啊爬~爬啊爬毛毛蟲爬到了一顆小小的「毛景樹」下面,發現樹上長著他最愛吃的毛毛果~ 「毛景樹」上有n個節點和n-1條樹枝,但節點上是沒有毛毛果的,毛毛果都是長在樹枝上的。但是這棵「毛景樹」有著神奇的魔力,他能改變樹枝上毛毛果的個數:

輸入格式:

第一行乙個正整數n。

接下來n-1行,每行三個正整數ui,vi和wi,第i+1行描述第i條樹枝。表示第i條樹枝連線節點ui和節點vi,樹枝上有wi個毛毛果。 接下來是操作和詢問,以「stop」結束。

輸出格式:

對於毛毛蟲的每個詢問操作,輸出乙個答案。

輸入樣例#1: 複製

4

1 2 8

1 3 7

3 4 9

max 2 4

cover 2 4 5

add 1 4 10

change 1 16

max 2 4

stop

輸出樣例#1: 複製

9

16

1<=n<=100,000,操作+詢問數目不超過100,000。

保證在任意時刻,所有樹枝上毛毛果的個數都不會超過10^9個。

//

luogu-judger-enable-o2

//媽的搞了兩天終於搞出來了

//邊權->點權

//每個點記錄和他爸爸相連的那條邊的權值

//對於修改和他爸爸相連的那條邊的操作,視為對這個點的操作

//找第k條邊:由於加的是雙向邊,所以第k條邊是2*k和2*k+1,找兩條邊連線的深度小的那個點v就是第k條邊

//所以,change操作就是單點修改

//cover就是區間修改

//add就是區間加

//max就是求區間最值

//lazy標記要分開記,因為 如果當前點有乙個修改標記但是沒下傳,又來了個add操作,這時候,下邊的點還沒改

//但是add標記把lazy標記給覆蓋了

//本來寫的是倆標記,但是只是用來判斷,用的addval做值的標記,但是一直wa

//寫成這樣就a了,但是感覺好像乙個樣的東西啊。。。。

//如果當前點由cover標記,要讓他的兒子的add標記=0

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=1e5+5

;const

int inf=0x7fffffff

;int

n,m;

inthead[n],num_edge;

struct

edge

edge[n

<<1

];struct

node

node[n];

struct

tree

tree[n<<2

];typedef tree*tree;

tree root,now_node=tree;

inline

intread()

inline

void add_edge(int u,int v,int

w)int dfs1(intu)}

intbound;

int dfs2(int u,int

top)

}node[u].t=bound;

}void build(tree &root,int l,int

r)inline

void pushdown(const tree &root)

if(root->tag1)

}void change(const tree &root,int l,int r,int

w) pushdown(root);

if(r<=root->mid)

change(root->lson,l,r,w);

else

if(l>root->mid)

change(root->rson,l,r,w);

else

root->maxn=max(root->lson->maxn,root->rson->maxn);

}void add(const tree &root,int l,int r,int

w) pushdown(root);

if(r<=root->mid)

add(root->lson,l,r,w);

else

if(l>root->mid)

add(root->rson,l,r,w);

else

root->maxn=max(root->lson->maxn,root->rson->maxn);

}int query(const tree &root,int l,int

r)inline

int query(int x,int

y)

else

}if(x==y)

return

ans;

else

if(node[x].dep>node[y].dep)

return max(ans,query(root,node[y].s+1

,node[x].s));

else

return max(ans,query(root,node[x].s+1

,node[y].s));

}inline

void add(int x,int y,int

addval)

else

}if(x==y)

return

;

else

if(node[x].dep>node[y].dep)

add(root,node[y].s+1

,node[x].s,addval);

else

add(root,node[x].s+1

,node[y].s,addval);

}inline

void change(int x,int y,int

w)

else

}if(x==y)

return

;

else

if(node[x].dep>node[y].dep)

change(root,node[y].s+1

,node[x].s,w);

else

change(root,node[x].s+1

,node[y].s,w);

}char s[10

];string

a;int

main()

dfs1(1);

dfs2(

1,1);

build(root,

1,n);

inta,b,c;

for(int i=1;ii)

while("

why"

)

else

if(s[0]=='a'

)

else

if(s[1]=='o'

)

else

}return0;

}

題解 P4315 月下「毛景樹」

看原題戳這兒 如題,肯定是樹鏈剖分的題。建議先a掉這道模板題 不會的先看這個 前置知識 鏈式前向星,樹,dfs序,lca,樹形dp,線段樹,樹鏈剖分 一定要先完全學懂,否則不保證這篇題解能完全看懂!先簡化題目 已知一棵包含 n 0 le n le 100000 個結點的樹 連通且無環 每條邊上包含乙...

洛谷P4315 月下「毛景樹」

毛毛蟲經過及時的變形,最終逃過的一劫,離開了菜媽的菜園。毛毛蟲經過千山萬水,歷盡千辛萬苦,最後來到了小小的紹興一中的校園裡。爬啊爬 爬啊爬毛毛蟲爬到了一顆小小的 毛景樹 下面,發現樹上長著他最愛吃的毛毛果 毛景樹 上有n個節點和n 1條樹枝,但節點上是沒有毛毛果的,毛毛果都是長在樹枝上的。但是這棵 ...

洛谷 P4315 月下「毛景樹」

題目 又是一道維護邊權的題 對於每乙個節點,我們把他的點權設為他跟他父親之間的邊權,這樣就輕鬆地把邊權轉化為了點權 但是,這題的重點就在 同時維護區間加和區間修改 對於乙個區間 k kk,我們設 max v k maxv k maxv k 為區間最大值,add k c k add k c k add...