小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。我們可以把這...