給定n個[1-x]的隨機整數\(a_1,a_2,a_3,...,a_n\)和q個詢問區間\((l_i,r_i)\),
求出\(\max_^(^)}\)的期望
對於10%的資料,\(n,x,q≤6\)。
對於另外20%的資料,\(q=1\)。
對於50%的資料,\(n,x,q≤300\)。
對於100%的資料,\(1≤n,x,q≤2000\),對於每個i,\(1≤li≤ri≤n\)。
又是一道期望大火題
又一次去看題解(我怎麼這麼菜)
考慮兩個區間\([l1,r1]\)和\([l2,r2]\),其中\(l1\geq l2\geq r2 \geq r1\),那麼有\(min[l1,r1]\leq min[l2,r2]\),
因此,如果大區間覆蓋率小區間,那麼大區間對於期望就根本沒有貢獻(因為小區間的\(min\)總是會大於大區間),經過一番排序和去重之後可以得到若干個\(l\)和\(r\)都單調遞增的區間,這裡的區間個數記為\(tot\)
接下來我們思考每個詢問的結果和最後答案的關係
乙個詢問區間中只要有乙個數 \(\leq x\),那麼這個區間的答案都會\(\leq x\);
如果每個詢問區間的答案都\(\leq x\),那麼最後的最大值就會\(\leq x\)
於是我們可以通過各種組合亂搞來滿足上面的需求,
得到單個詢問區間結果\(\leq x\)的概率\(p(ans\leq x)\)
當q=1的時候\(\sum_^\)就是答案啦
並且根據上面的式子我們可以繼續往下推出
對於乙個隨機正整數變數\(k\geq 0\),其期望
\[e(k)=\sum_^
\]update 3.27:其實就是乙個差分嘛
考慮暴力求出\(p(k \geq i)\)
按照上面的思路,乙個更好的做法是求出\(p(k\leq i-1)\)那麼其實
\[e(k)=\sum_^=\sum_^=x-\sum_^
\](因為\(p(k\leq x)==1\))
於是對於每乙個\(p(k\leq x)\)我們暴力計算
需要轉換一下思路:考慮每乙個數\(a_i\)能滿足哪些區間
由於我們之前已經對區間進行了去重和排序,
那麼我們可以知道,每個元素所在的詢問集合一定是乙個連續的區間
意即只要這乙個元素\(\leq i\),那麼這個元素所在的詢問集合的取值都會\(\leq i\);
而我們需要用某些元素滿足所有的詢問
因此這個問題轉換成了乙個區間覆蓋問題:
我們有\(n\)個區間(\(n\)個元素各對應乙個詢問集合),每個詢問區間有\(p=p(k\leq i)=\frac\)的概率被取到,求整段\([1-q]\)被覆蓋的概率
於是我們可以設定狀態\(f[i]\)表示強制選擇第\(i\)個區間,並且選擇區間集合包含了前\(i\)個區間的右端點的概率,則
\[f[i]=(\sum_^}\times p)+[l[i]==1](1-p)^\times p
\]最後$$ans=\sum_)}$$
然而這個轉移是\(o(n^2)\)的有木有!!!
其實有另一種更簡單的50分做法,由於跟正解關係不大故不做贅述
可以看出我們每次需要o(n)計算的一大段\(\sum_^}\)其實是一段連續並且左端點和右端點均單調不降的
因此使用單調指標記錄這個值即可,一次dp的複雜度降為\(o(n)\)
update 3.27:直接記錄乙個字首和就可以啦!!!
總複雜度\(o(nx)\)
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define pb push_back
#define rg register
#define il inline
using namespace std;
const int mod=666623333;
const int n=2010;
typedef unsigned long long ull;
typedef vectorvi;
typedef long long ll;
typedef double dd;
il ll read()
il ll poww(ll a,ll b)
il ll fac(ll x)
int tot,cnt;
struct linet[n],q[n],l[n];
bool cmp(line a,line b)
for(rg int i=1;i<=cnt;i++)
if(l[i].r==tot)
sum=(sum+1ll*f[i]*poww(1-p+mod,cnt-i)%mod)%mod;
return sum;
}il void solve()
int main()
luogu2044 隨機數生成器
題目描述 棟棟最近迷上了隨機演算法,而隨機數是生成隨機演算法的基礎。棟棟準備使用線性同餘法 linear congruential method 來生成乙個隨機數列,這種方法需要設定四個非負整數引數m,a,c,x 0 按照下面的公式生成出一系列隨機數 x n 1 ax n c mod m用這種方法生...
隨機數生成器
標頭檔案 內容 rand,srand函式和rand max常量 rand max 在windows系統中為32767 在類unix系統中為2147483647 rand 函式返回乙個0 rand max的隨機整數 srand seed 函式 接受unsigned int 型別的引數seed,以see...
MATLAB隨機數生成器
1 rand 生成 0,1 區間上均勻分布的隨機數 基本語法 rand m,n,p 生成排列成m n p 多維向量的隨機數。如果只寫m,則生成m m矩陣 如果引數為 m,n 可以省略方括號。2 randn 生成服從標準正太分布 均值為0,方差為1 的隨機數 基本語法 randn m,n,p,解釋同1...