BZOJ4712 洪水 樹鏈剖分維護Dp

2021-09-26 19:38:54 字數 3004 閱讀 4876

小a走到乙個山腳下,準備給自己造乙個小屋。這時候,小a的朋友(op,又叫管理員)開啟了創造模式,然後飛到

山頂放了格水。於是小a面前出現了乙個瀑布。作為平民的小a只好老實巴交地爬山堵水。那麼問題來了:我們把這

個瀑布看成是乙個n個節點的樹,每個節點有權值(爬上去的代價)。小a要選擇一些節點,以其權值和作為代價將

這些點刪除(堵上),使得根節點與所有葉子結點不連通。問最小代價。不過到這還沒結束。小a的朋友覺得這樣

子太便宜小a了,於是他還會不斷地修改地形,使得某個節點的權值發生變化。不過到這還沒結束。小a覺得朋友做

得太絕了,於是放棄了分離所有葉子節點的方案。取而代之的是,每次他只要在某個子樹中(和子樹之外的點完全

無關)。於是他找到你。

輸入檔案第一行包含乙個數n,表示樹的大小。

接下來一行包含n個數,表示第i個點的權值。

接下來n-1行每行包含兩個數fr,to。表示書中有一條邊(fr,to)。

接下來一行乙個整數,表示操作的個數。

接下來m行每行表示乙個操作,若該行第乙個數為q,則表示詢問操作,後面跟乙個引數x,表示對應子樹的根;若

為c,則表示修改操作,後面接兩個引數x,to,表示將點x的權值加上to。

n<=200000,保證任意to都為非負數

對於每次詢問操作,輸出對應的答案,答案之間用換行隔開。

44 3 2 1

1 21 3

4 24

q 1q 2

c 4 10

q 1314

**:

1 #include2 #include3 #include4

#define lll spc<<1

5#define rrr spc<<1|1

6 typedef long

long

lnt;

7const

int n=200010;8

struct

trnttr[n<<2

];12

struct

pntp[n];

24struct

ente[n<<1

];28

intcnt;

29int

n,m;

30int

dfn;

31int

plc[n];

32char cmd[100

];33

void ade(int f,int

t)34

41void basic_dfs(int x,int

f)4260}

61if(!p[x].mxs)

62 p[x].sigf=0x3f3f3f3f

;63 p[x].f=std::min(p[x].val,p[x].sigf);

64return;65

}66void build_dfs(int x,int

top)

6781

return

; 82}83

void pushup(int

spc)

8488

void add(int

spc,lnt v)

8994

void pushdown(int

spc)

95102

return

;103

}104

void build(int l,int r,int

spc)

105111

int mid=(l+r)>>1

;112

build(l,mid,lll);

113 build(mid+1

,r,rrr);

114pushup(spc);

115return

;116

}117

void update(int l,int r,int pos,int

spc,lnt v)

118124

int mid=(l+r)>>1

;125

pushdown(spc);

126if(pos<=mid)

127update(l,mid,pos,lll,v);

128else

129 update(mid+1

,r,pos,rrr,v);

130pushup(spc);

131return

;132

}133

int scupdate(int l,int r,int ll,int rr,int

spc,lnt v)

134144

if(ll<=l&&r<=rr&&tr[spc].minv>v)

145149

int mid=(l+r)>>1

;150

pushdown(spc);

151int plcc=scupdate(mid+1

,r,ll,rr,rrr,v);

152if(!plcc)

153 plcc=scupdate(l,mid,ll,rr,lll,v);

154pushup(spc);

155return

plcc;

156}

157 lnt query(int l,int r,int pos,int

spc)

158167

void update(int

x,lnt v)

168180

}181

}182

intmain()

183194 basic_dfs(1,1

);195 build_dfs(1,1

);196 build(1,n,1

);197 scanf("

%d",&m);

198while(m--)

199else

217}

218return0;

219 }

BZOJ4712 洪水 樹鏈剖分維護Dp

小a走到乙個山腳下,準備給自己造乙個小屋。這時候,小a的朋友 op,又叫管理員 開啟了創造模式,然後飛到 山頂放了格水。於是小a面前出現了乙個瀑布。作為平民的小a只好老實巴交地爬山堵水。那麼問題來了 我們把這 個瀑布看成是乙個n個節點的樹,每個節點有權值 爬上去的代價 小a要選擇一些節點,以其權值和...

BZOJ4712 洪水 樹鏈剖分 線段樹

小a走到乙個山腳下,準備給自己造乙個小屋。這時候,小a的朋友 op,又叫管理員 開啟了創造模式,然後飛到山頂放了格水。於是小a面前出現了乙個瀑布。作為平民的小a只好老實巴交地爬山堵水。那麼問題來了 我們把這個瀑布看成是乙個n個節點的樹,每個節點有權值 爬上去的代價 小a要選擇一些節點,以其權值和作為...

bzoj4712 洪水 樹鏈剖分 動態dp

我們首先想乙個dp方程 f u mi nf u min val u f u m in。這個方程可以通過矩陣的形式來表示。先把樹輕重鏈剖分了。我們設g u g u g u 為u uu的所有輕兒子的f ff總和,v vv為u uu的重兒子。則f u mi nf u min f u m in。我們可以把這...