與hdu4336 card collector相似,使用min-max容斥。
設\(\max(s)\)表示集合\(s\)中最後一位出現的期望時間。
設\(\min(s)\)表示集合\(s\)中最初一位出現的期望時間。
由min-max容斥可得:
\(\max(t)=\sum\limits_(-1)^\min(s)\)
考慮求每乙個\(\min(s)\)。
乙個很顯然的暴力**:
for(int i=0;i<(1《我們考慮對於每乙個集合\(s\),實質上只有與它沒有交集的數對它沒有貢獻。
那麼我們可以用總貢獻減去與它沒有交集的數的貢獻。
即對於每乙個數,只需要對它的補集的子集全部減去它的貢獻即可。
這個很顯然能夠\(o(nlogn)\)計算出來。
那麼就做完啦。
#include using namespace std;
int n;
double p[(1<<20)+5],a[25];
int main()
for(int i=0;ifor(int j=0;jfor(int i=0;i<(1
for(int i=1;i<(1
洛谷 P3177 HAOI2015 樹上染色
懶得複製題面了直接傳送門吧 直接求點與點之間的距離感覺不是很好求,所以我們考慮換乙個求法。瞄了一眼題解 距離跟路徑上邊的長度有關,所以我們直接來看每一條邊的貢獻吧 這誰想得到啊 對於每一條邊,它的貢獻等於 一邊的白點數 另一邊的白點數 一邊的黑點數 另一邊的黑點數 邊權 然後。我又卡住了。再次瞄題解...
洛谷 P3177 HAOI2015 樹上染色
有一棵點數為 n 的樹,樹邊有邊權。給你乙個在 0 n 之內的正整數 k 你要在這棵樹中選擇 k 個點,將其染成黑色,並將其他 的 n k 個點染成白色 將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間的距離的和的受益。問受益最大值是多少。有點難想的dp 我果然太菜了 stdcall f ...
洛谷P3175 按位或
剛開始你有乙個數字 0 每一秒鐘你會隨機選擇乙個 0,2 n 1 的數字,與你手上的數字進行或 c c 的 pascal 的or 操作。選擇數字 i 的概率是 p i 保證 0 leq p i leq 1 sum p i 1 問期望多少秒後,你手上的數字變成 2 n 1 設 s 為全集 s 設 e ...