毛毛蟲經過及時的變形,最終逃過的一劫,離開了菜媽的菜園。 毛毛蟲經過千山萬水,歷盡千辛萬苦,最後來到了小小的紹興一中的校園裡。
爬啊爬~爬啊爬毛毛蟲爬到了一顆小小的「毛景樹」下面,發現樹上長著他最愛吃的毛毛果~ 「毛景樹」上有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個。
樹鏈剖分+線段樹。
同時有 區間加 與 區間修改。
pushdown 時先區間修改,並把左右兒子的區間加標記改為0,再下傳區間加。
線段樹區間修改時,還要將區間加的標記改為0!
還有,注意邊權轉點權。
附**:
#include#include#include#define lson rt<<1
#define rson rt<<1|1
#define data(x) b[x].data
#define sign1(x) b[x].c
#define sign2(x) b[x].d
#define lside(x) b[x].l
#define rside(x) b[x].r
#define maxn 100010
using namespace std;
int n,c=1,d=1;
int head[maxn],deep[maxn],size[maxn],son[maxn],fa[maxn],top[maxn],id[maxn];
struct node1a[maxn<<1];
struct node2b[maxn<<2];
struct node3g[maxn];
inline int read()
while(c>='0'&&c<='9')
return date*w;
}inline int max(const int &x,const int &y)
inline void add(int u,int v,int w)
void dfs1(int rt)
void update_one(int l,int r,int c,int rt)
pushdown(rt);
mid=lside(rt)+rside(rt)>>1;
if(l<=mid)update_one(l,r,c,lson);
if(mid>1;
if(l<=mid)update_two(l,r,c,lson);
if(mid>1;
if(l<=mid)ans=max(ans,query(l,r,lson));
if(middeep[y])swap(x,y);
if(x!=y)update_one(id[x]+1,id[y],k,1);
return;
}void work2(int x,int y,int k)
void work3(int x,int y)
void work()
if(ch[1]=='o')
break;
}case 'a':
case 'm':
} }}void init()
}int main()
洛谷 P4315 月下「毛景樹」
題目 又是一道維護邊權的題 對於每乙個節點,我們把他的點權設為他跟他父親之間的邊權,這樣就輕鬆地把邊權轉化為了點權 但是,這題的重點就在 同時維護區間加和區間修改 對於乙個區間 k kk,我們設 max v k maxv k maxv k 為區間最大值,add k c k add k c k add...
P4315 月下「毛景樹」
毛毛蟲經過及時的變形,最終逃過的一劫,離開了菜媽的菜園。毛毛蟲經過千山萬水,歷盡千辛萬苦,最後來到了小小的紹興一中的校園裡。爬啊爬 爬啊爬毛毛蟲爬到了一顆小小的 毛景樹 下面,發現樹上長著他最愛吃的毛毛果 毛景樹 上有n個節點和n 1條樹枝,但節點上是沒有毛毛果的,毛毛果都是長在樹枝上的。但是這棵 ...
題解 P4315 月下「毛景樹」
看原題戳這兒 如題,肯定是樹鏈剖分的題。建議先a掉這道模板題 不會的先看這個 前置知識 鏈式前向星,樹,dfs序,lca,樹形dp,線段樹,樹鏈剖分 一定要先完全學懂,否則不保證這篇題解能完全看懂!先簡化題目 已知一棵包含 n 0 le n le 100000 個結點的樹 連通且無環 每條邊上包含乙...