HAOI2015 按位或 容斥 字首和

2022-07-13 20:03:18 字數 1243 閱讀 7718

題目描述

剛開始你有乙個數字0,每一秒鐘你會隨機選擇乙個[0,2^n-1]的數字,與你手上的數字進行或(c++,c的|,pascal

的or)操作。選擇數字i的概率是p[i]。保證0<=p[i]<=1,σp[i]=1問期望多少秒後,你手上的數字變成2^n-1。

題解

min-max容斥

大概就是這麼兩個東西,做題思路大概就是正難則反吧,max不好求但min好求,就可以直接用這種方法上了。

現在我們算maxv(s),然鵝它不好算,所以我們就轉換求所有minv(s)。

考慮乙個事件發生的概率為p,那麼我們就有了求min的方法。

sum=1*p+2*(p-1)*p+3*(p-1)^2*p......

然後用高中數學知識,解得它等於1/p。

然後我們的任務變成了求所有子集的p。

這玩意也不太好求,因為所有與這個集合有交的數都會產生貢獻。

再次正難則反一下,變成了1-補集,這個補集和很好,它就是補集的高維字首和。

有人說這是fmt,但好像fwt的異或卷積也長這樣?

**

#include#include

#include

#define n (1<<20)+20

using

namespace

std;

const

double eps=1e-10

;int

n,size,cnt[n];

double

ans,a[n];

inline

intrd()

while(isdigit(c))

return f?-x:x;

} int

main()

if(cnt[i]&1)ans+=(double)1/x;else ans-=(double)1/x;

}printf(

"%.10lf

",ans);

return0;

}

我看到網上還有這麼一種解法

然而我並沒有看懂。。。

HAOI2015 樹上染色

有一棵點數為 n 的樹,樹邊有邊權。給你乙個在 0 n 之內的正整數k,你要在這棵樹中選擇 k 個點,將其染成黑色,並將其他的 n k個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。輸入第一行兩個整數 n,k。接下來 n 1 行每行三個正整...

HAOI2015 樹上染色

考慮子樹當中所有邊的貢獻即可。然後就能簡單做樹上揹包了。但是要注意列舉的順序,應該從大到小更新,否則某個狀態會多次被加。如果不想考慮列舉順序,那麼直接dp的時候用乙個臨時陣列記錄。ac pragma gcc optimize ofast funroll all loops include defin...

HAOI2015 樹上染色

嘟嘟嘟 首先這一眼看出來,要樹形dp。然後發現狀態不好設,剛開始我想的是dp i j 表示以 i 為根的子樹,選了 j 個黑點的最大價值。結果就不會轉移了。轉移的時候想考慮 這一條邊的貢獻,但是發現這個狀態的轉移所涉及的不只是這一條邊,還有子樹中的邊,於是就徹底gg了。還是看了題解。題解也是考慮貢獻...