1. 程式人生 > >[bzoj5072] [十月月賽] 小A的樹 樹上揹包

[bzoj5072] [十月月賽] 小A的樹 樹上揹包

題意

給定一棵n個點的樹,樹上某些點是黑點。每次詢問是否能選出一個x個點的聯通塊,使其中有y個黑點。
詢問數105,n5000。資料組數5

分析

一棵樹上的聯通塊是一棵樹,因此考慮從兒子向父親合併資訊。那我們可以維護每個點選含自己的字數內i個點的聯通塊,其中有j個黑點的可行性,轉移列舉兒子,列舉選點數量即可轉移。
這樣顯然不行。於是我們發掘一下特性,發現不需要計算每個黑點數量的答案,因為一個子樹內選黑點數量的可行性是連續的一段區間。就是說如果取l個黑點是可行的,取r個黑點是可行的,那麼取[l,r]個黑點是可行的。
於是維護每個子樹選i個點的聯通塊,可行黑點最大值和最小值是多少。然後列舉選點數量。

[ + view code ]