洛谷 P4315 月下「毛景樹」

2021-10-23 01:49:15 字數 3371 閱讀 7012

題目

又是一道維護邊權的題

對於每乙個節點,我們把他的點權設為他跟他父親之間的邊權,這樣就輕鬆地把邊權轉化為了點權

但是,這題的重點就在 同時維護區間加和區間修改

對於乙個區間 k

kk,我們設 max

v[k]

maxv[k]

maxv[k

] 為區間最大值,add

[k],

c[k]

add[k],c[k]

add[k]

,c[k

] 分別為區間加和區間修改的懶標記

跟p3373 【模板】線段樹 2很像的是,我們需要維護兩個優先順序不同的懶標記。

在區間修改時,讓 max

v[k]

=c[k

]=

vmaxv[k]=c[k]=v

maxv[k

]=c[

k]=v

(v為要修改的值),並且覆蓋掉之前打過的 add

[k

]add[k]

add[k]

(賦值為 000)

區間加時,就直接更新 max

v[k]

,add

[k

]maxv[k],add[k]

maxv[k

],ad

d[k]

就好了在下放標記時,先放 c[k

]c[k]

c[k]

,再放 add

[k

]add[k]

add[k]

。下放完後記得歸零

**

#include

#include

#include

#include

using

namespace std;

const

int maxn=

200000+10

,maxm=

800000+10

;struct edge};

struct edgeg[maxn]

;int maxv[maxn]

,add[maxn]

,c[maxn]

;int top[maxn]

,s[maxn]

,id[maxn]

;int f[maxn]

,son[maxn]

,d[maxn]

;int a[maxn]

,w[maxn]

;int n,idcnt;

vector e[maxn]

;inline

intread()

while

(ch>=

'0'&& ch<=

'9')s=

(s<<3)

+(s<<1)

+(ch^48)

,ch=

getchar()

;return s*w;

}inline

void

push_up

(int k)

inline

void

upd_add

(int k,

int v)

inline

void

upd_change

(int k,

int v)

inline

void

push_down

(int k)

if(add[k])}

void

modify_add

(int k,

int l,

int r,

int x,

int y,

int v)

void

modify_change

(int k,

int l,

int r,

int x,

int y,

int v)

intquery

(int k,

int l,

int r,

int x,

int y)

void

dfs1

(int x,

int fa,

int len)

}void

dfs2

(int x,

int topp)

}void

build

(int k,

int l,

int r)

int mid=

(l+r)

>>1;

build

(k<<

1,l,mid)

;build

(k<<1|

1,mid+

1,r)

;push_up

(k);

}void

seq_change

(int x,

int y,

int v)

if(d[x]

>d[y]

)swap

(x,y);if

(x==y)

return

;modify_change(1

,1,n,id[x]+1

,id[y]

,v);

}void

seq_add

(int x,

int y,

int v)

if(d[x]

>d[y]

)swap

(x,y);if

(x==y)

return

;modify_add(1

,1,n,id[x]+1

,id[y]

,v);

}int

query_seq

(int x,

int y)

if(d[x]

>d[y]

)swap

(x,y);if

(x==y)

return ret;

return

max(ret,

query(1

,1,n,id[x]+1

,id[y]))

;}intmain()

dfs1(1

,0,0

);dfs2(1

,1);

build(1

,1,n);

while(1

)if(opt[0]

=='c'

&& opt[1]

=='o')if

(opt[0]

=='a')if

(opt[0]

=='m')}

return0;

}

洛谷P4315 月下「毛景樹」

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

P4315 月下「毛景樹」

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

題解 P4315 月下「毛景樹」

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