毛毛蟲經過及時的變形,最終逃過的一劫,離開了菜媽的菜園。 毛毛蟲經過千山萬水,歷盡千辛萬苦,最後來到了小小的紹興一中的校園裡。爬啊爬~爬啊爬~~毛毛蟲爬到了一顆小小的「毛景樹」下面,發現樹上長著他最愛吃的毛毛果~~~ 「毛景樹」上有n個節點和n-1條樹枝,但節點上是沒有毛毛果的,毛毛果都是長在樹枝上的。但是這棵「毛景樹」有著神奇的魔力,他能改變樹枝上毛毛果的個數: change k w:將第k條樹枝上毛毛果的個數改變為w個。 cover u v w:將節點u與節點v之間的樹枝上毛毛果的個數都改變為w個。 add u v w:將節點u與節點v之間的樹枝上毛毛果的個數都增加w個。 由於毛毛蟲很貪,於是他會有如下詢問: max u v:詢問節點u與節點v之間樹枝上毛毛果個數最多有多少個。
第一行乙個正整數n。 接下來n-1行,每行三個正整數ui,vi和wi,第i+1行描述第i條樹枝。表示第i條樹枝連線節點ui和節點vi,樹枝上有wi個毛毛果。 接下來是操作和詢問,以「stop」結束。
對於毛毛蟲的每個詢問操作,輸出乙個答案。
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
stop916
【data range】
1<=n<=100,000,操作+詢問數目不超過100,000。
保證在任意時刻,所有樹枝上毛毛果的個數都不會超過10^9個
樹鏈剖分+線段樹;
注意是邊權
1 #include2const
int maxn=1e5+10
;3 inline int min_(int x,int y)
4 inline int max_(int x,int y)
5 inline void swap_(int&x,int&y)
6intn;7
inta,b,c;
8int s[maxn],ss,ts[maxn<<2],tl[maxn<<2],tf[maxn<<2];9
intps[maxn],pd[maxn],pf[maxn],pt[maxn],pp[maxn],pps,psz[maxn],pws[maxn];
10int h[maxn],ep[maxn],hs,et[maxn<<1],es[maxn<<1],en[maxn<<1],eid[maxn<<1
];11
void dfs1(int k,int f,int
d)19}20
void dfs2(int k,int
t)27}28
void build(int k,int l,int
r)30
int mid=l+r>>1,ls=k<<1,rs=ls|1;31
build(ls,l,mid);
32 build(rs,mid+1
,r);
33 ts[k]=max_(ts[ls],ts[rs]);34}
35void downl(int k,int ls,int
rs)40
void downf(int k,int ls,int
rs)45
void change(int k,int l,int r,int al,int ar,int
v)47
int mid=l+r>>1,ls=k<<1,rs=ls|1;48
if(tl[k]) downl(k,ls,rs);
49if
(tf[k]) downf(k,ls,rs);
50if(al<=mid) change(ls,l,mid,al,min_(ar,mid),v);
51if(ar>mid) change(rs,mid+1,r,max_(al,mid+1
),ar,v);
52 ts[k]=max_(ts[ls],ts[rs]);53}
54void add(int k,int l,int r,int al,int ar,int
v)56
int mid=l+r>>1,ls=k<<1,rs=ls|1;57
if(tl[k]) downl(k,ls,rs);
58if
(tf[k]) downf(k,ls,rs);
59if(al<=mid) add(ls,l,mid,al,min_(ar,mid),v);
60if(ar>mid) add(rs,mid+1,r,max_(al,mid+1
),ar,v);
61 ts[k]=max_(ts[ls],ts[rs]);62}
63int query(int k,int l,int r,int al,int
ar)72
intmain()
79 dfs1(1,1,1
);80 dfs2(1,1
);81 build(1,1
,n);
82char ch[10
];83
while(scanf("
%s",ch)!=eof)
89if(ch[1]=='o'
)96if(pd[a]>pd[b]) swap_(a,b);
97if(pp[b]>pp[a]) change(1,1,n,pp[a]+1
,pp[b],c);98}
99}100if(ch[0]=='a'
)107
if(pd[a]>pd[b]) swap_(a,b);
108if(pp[b]>pp[a]) add(1,1,n,pp[a]+1
,pp[b],c);
109}
110if(ch[0]=='m'
)117
if(pd[a]>pd[b]) swap_(a,b);
118if(pp[b]>pp[a]) c=max_(c,query(1,1,n,pp[a]+1
,pp[b]));
119 printf("
%d\n
",c);
120}
121if(ch[0]=='
s') return0;
122}
123 }
我**常數巨大,您怕不怕?
1984
accepted
14180 kb
4284 ms
c++/edit
3716 b
2017-06-10 15:01:51
BZOJ1984 月下「毛景樹」
time limit 20 sec memory limit 64 mb submit 1583 solved 500 submit status discuss 毛毛蟲經過及時的變形,最終逃過的一劫,離開了菜媽的菜園。毛毛蟲經過千山萬水,歷盡千辛萬苦,最後來到了小小的紹興一中的校園裡。爬啊爬 爬啊...
bzoj1984 月下「毛景樹」
傳送門 果然強校出的題都有坑 好吧其實是我太弱 都知道化邊權為點權了還沒發現鏈上查詢和修改時的坑 知道了這個這題就是板子題了 code include includeusing namespace std define n 100005 struct tree t n 2 int f n deep ...
BZOJ1984 月下「毛景樹」
題目 月下 毛景樹 解析 樹鏈剖分。注意一下線段樹的標記下傳的問題,先下傳覆蓋標記再下傳增加標記,且下傳覆蓋標記後要將增加標記取消。詳見 算了還是說下問什麼這樣下傳標記吧。如果先下傳add再下傳cover,你會發現對於修改同一區間,操作順序是先add再cover時下傳沒有問題,但如果是先cover再...