傳送門:
你有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中看看是不...