毛毛蟲經過及時的變形,最終逃過的一劫,離開了菜媽的菜園。 毛毛蟲經過千山萬水,歷盡千辛萬苦,最後來到了小小的紹興一中的校園裡。
爬啊爬~爬啊爬毛毛蟲爬到了一顆小小的「毛景樹」下面,發現樹上長著他最愛吃的毛毛果~ 「毛景樹」上有n個節點和n-1條樹枝,但節點上是沒有毛毛果的,毛毛果都是長在樹枝上的。但是這棵「毛景樹」有著神奇的魔力,他能改變樹枝上毛毛果的個數:
輸入格式:
第一行乙個正整數n。
接下來n-1行,每行三個正整數ui,vi和wi,第i+1行描述第i條樹枝。表示第i條樹枝連線節點ui和節點vi,樹枝上有wi個毛毛果。 接下來是操作和詢問,以「stop」結束。
輸出格式:
對於毛毛蟲的每個詢問操作,輸出乙個答案。
輸入樣例#1: 複製
41 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: 複製
916
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...