codeforces 1194F 組合數學

2021-09-25 07:18:48 字數 2292 閱讀 7637

傳送門:

你有n個事件,你需要按照1~n的順序完成這些事件,每個事件需要\(t_i\)的時間完成,你現在一共有t的時間去做這些事情,每做一件事情的時候,你有0.5的概率花費\(t_i\)的時間完成他,也有0.5的概率花費\(t_i+1\)的時間去完成他,如果在做這個事件的時候時間花完了,你就相當於沒有做成這個事件,現在問你在t的時間內完成的事件的個數的期望是多少

讀完題後想到的應該是乙個概率dp,但是t有\(2e14\)的大小,我們現在著手於如何優化他

首先,我的每乙個事件都只有兩種情況,如果是情況1 ,就按照原本的時間去完成他,如果是情況2,我就要在原本的時間的基礎上加上乙個1,那麼我完成k個事件時,我始終是要花費sum[k]的時間去做這些事件的,這裡的sum是t的字首和

所以我們其實不用管時間這個限制條件了,我們只需要得到,前i個事件中我有多少個事件需要花費+1的這個時間去完成他的事件的個數,那麼這樣我們就變成了乙個組合數的問題了

我們可以得到在我們完成k個事件時,有i個事件出現了+1的情況

那麼這個概率就是\((\frac)^k*c_k^\)這個就很容易理解,如果求期望那麼乘上乙個k就可以了

那麼我總的期望就是\(\sum_^(\frac)^(posmax)*c_k^*posmax\)

posmax表示,我當前最多可以完成的事件

我們用乙個副本posmaxtmp來表示posmax完成這些事件的時間

那麼在迴圈中posmaxtmp每次+1時就可以使得完成乙個事件的時間+1

如果posmaxtmp大於t了,我們後面的事件就完不成,posmax就得往前走,這裡需要處理一下下

並且,當posmaxtmp大於t時,我也需要算出這一部分的期望即完成posmax-1個事件時對答案的貢獻

#include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

typedef pairpii;

typedef unsigned long long ull;

#define ls rt<<1

#define rs rt<<1|1

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

#define bug printf("*********\n")

#define fin freopen("input.txt","r",stdin);

#define fon freopen("output.txt","w+",stdout);

#define io ios::sync_with_stdio(false),cin.tie(0)

#define debug1(x) cout<<"["<<#x<<" "<<(x)<<"]\n"

#define debug2(x,y) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<"]\n"

#define debug3(x,y,z) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<" "<<#z<<" "<>= 1;

}return ret;

}void init()

invf[maxn - 1] = power(f[maxn - 1], mod - 2);

for(int i = maxn - 2; i >= 0; i--)

}ll c(int n, int m)

ll t[maxn];

ll sum[maxn];

int main()

// debug1(t);

int posmax = n;

for(int i = 1; i <= n; i++)

}// debug1(posmax);

int num;

int inv2 = invf[2];

ll res = 0;

ll posmaxtmp = sum[posmax] - 1;

// debug1(inv2);

for(int i = 0; i <= posmax; i++)

if(i > posmax) break;

res += power(inv2, posmax) % mod * c(posmax, i) % mod * posmax % mod;

res %= mod;

}cout << res << endl;

return 0;

}

codeforces 1114F 線段樹練習

這是一道用線段樹維區間值的一道題,題意很簡單,就是對於給定的乙個序列,初始時每個數的值不大於300,然後有兩中操作,乙個是對區間 l,r 的每個數乘上以個數x,乙個是詢問區間的乘積的尤拉函式值,首先對於第乙個操作顯然可以用線段樹的延遲更新來完成,對於第二個操作,我最先沒考慮資料,就想著直接維護區間的...

Codeforces 985F 字串雜湊

題目鏈結 題意簡述 給定乙個長度為n n 2e5 的字串s 僅含有小寫字母 有m m 2e5 次查詢。每次查詢給三個數,x,y,len,求在s x s x len 1 和s y s y len 1 是否存在相應位置唯一對應關係。例如aba和brb,aaa和kkk,abs和ert是唯一對應。aab和a...

codeforces 1108F 最小生成樹並查集

讓我想起了徐州的第一題。還以為比那題更難 第二天早上隊友跟我聊了下這題,然後我發現這題就可以用我徐州第一題的錯誤的思路做 雖然那題因為資料特殊性a了。我們開兩個並查集,對於一段相同的邊,f1表示這段相同的邊之前的連線情況,然後從前向後列舉這段邊,如果能連就連,只更新f2,如果不能連,去f1中看看是不...