luogu3600 隨機數生成器

2022-05-08 06:24:10 字數 2568 閱讀 2071

給定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...