bzoj4027: [heoi2015]兔子與櫻花
很久很久之前,森林裡住著一群兔子。有一天,兔子們突然決定要去看櫻花。兔子們所在森林裡的櫻花樹很特殊。櫻花樹由n個樹枝分叉點組成,編號從0到n-1,這n個分叉點由n-1個樹枝連線,我們可以把它看成乙個有根樹結構,其中0號節點是根節點。這個樹的每個節點上都會有一些櫻花,其中第i個節點有c_i朵櫻花。櫻花樹的每乙個節點都有最大的載重m,對於每乙個節點i,它的兒子節點的個數和i節點上櫻花個數之和不能超過m,即son(i) + c_i <= m,其中son(i)表示i的兒子的個數,如果i為葉子節點,則son(i) = 0
現在兔子們覺得櫻花樹上節點太多,希望去掉一些節點。當乙個節點被去掉之後,這個節點上的櫻花和它的兒子節點都被連到刪掉節點的父節點上。如果父節點也被刪除,那麼就會繼續向上連線,直到第乙個沒有被刪除的節點為止。
現在兔子們希望計算在不違背最大載重的情況下,最多能刪除多少節點。
注意根節點不能被刪除,被刪除的節點不被計入載重。
第一行輸入兩個正整數,n和m分別表示節點個數和最大載重
第二行n個整數c_i,表示第i個節點上的櫻花個數
接下來n行,每行第乙個數k_i表示這個節點的兒子個數,接下來k_i個整數表示這個節點兒子的編號
一行乙個整數,表示最多能刪除多少節點。
10 4
0 2 2 2 4 1 0 4 1 1
3 6 2 3
1 91 8
1 10
02 7 4
01 504
對於100%的資料,1 <= n <= 2000000, 1 <= m <= 100000, 0 <= c_i <= 1000
資料保證初始時,每個節點櫻花數與兒子節點個數之和大於0且不超過m
題解here!
額,剛拿到手自然沒有什麼思路。。。
我們自底向上,貪心的優先刪除每個點的兒子中代價最小的乙個。
即:以$son[i]+val[i]$為$i$點的代價,每個點我們選取代價最小的刪除,結果一定不會變差。
證明?不存在的如下:
首先對於$i$點和$i$的兩個兒子$p,q$,由決策包容性我們可以知道:
如果$val[p]+son[p]所以我們從根節點$dfs$,從葉子結點向上回溯。
路上如果遇到能刪除的點就刪,不必考慮其祖先。
這個證明。。。$emmm.... $
證明:設點$i$的兒子是$p$,$p$的兄弟是$q$,$j$還有乙個兒子是$j$。
$dfs$的過程中,如果在回溯到$p$的時候發現可以刪除$j$,那麼就刪除$j$,並更新$p$本身的代價。
這樣可能會導致無法再回溯到$i$點的時候刪除$q$。
等一下,這不是有後效性嘛。
但是因為貪心刪了兒子而導致這個點不能再刪,那麼我們只會損失乙個點,就是該點。
而刪除兒子至少會刪除乙個,所以不會虧。。。
所以,自底向上的刪除無後效性,滿足貪心性質。
然後就可以愉快地$dfs$了。
附**:
#include#include#include#define maxn 2000010using namespace std;
int n,m,c=1,ans=0;
int val[maxn],head[maxn],son[maxn],num[maxn],left[maxn],right[maxn];
inline int read()
while(c>='0'&&c<='9')
return date*w;
}inline bool cmp(const int &p,const int &q)
void dfs(int rt)
else break; }}
void work()
void init()
}int main()
bzoj4027 heoi2015 兔子與櫻花
time limit 10 sec memory limit 256 mb submit 360 solved 187 submit status discuss 很久很久之前,森林裡住著一群兔子。有一天,兔子們突然決定要去看櫻花。兔子們所在森林裡的櫻花樹很特殊。櫻花樹由n個樹枝分叉點組成,編號從0...
BZOJ4027 HEOI2015 兔子與櫻花
bzoj4027 一開始想的都是二維的dp 資料這麼大怎麼轉移啊qa q 後來發現原來貪心就行辣。直接記ans i so ni c i 那麼將這個點刪除對應著其父節點 ansi 1那麼對於某個點 x 將兒子的an s值從小到大排徐,然後依次刪直到不能刪為止。然後刪下面的比刪上面的優。因為刪某個點 x...
bzoj4027 HEOI2015 兔子與櫻花
submit status discuss description 很久很久之前,森林裡住著一群兔子。有一天,兔子們突然決定要去看櫻花。兔子們所在森林裡的櫻花樹很特殊。櫻花樹由n個樹枝分叉點組成,編號從0到n 1,這n個分叉點由n 1個樹枝連線,我們可以把它看成乙個有根樹結構,其中0號節點是根節點。...