51nod 1850 抽卡大賽(動態DP?霧)

2021-09-13 13:51:05 字數 2622 閱讀 2168

51nod為了活躍比賽前的氣氛,組織了場抽卡比賽。這場比賽共 n個人參加,主辦方根據非歐血統鑑定器,得到了一些資料。每個人抽卡有 mi 種可能,得到的卡能力值為 aij 代價為 gij 的可能性為 pij ,所謂代價指的是玩家需要將一輪比賽後所得的點頭盾的 gij% 交給主辦方。每輪比賽每個人都隨機抽取卡片,待全部人抽取完畢後進行排名(按照a從大到小排),排在第 i 位的人有 vi 的點頭盾收入。現在主辦方想知道一輪比賽後每個人的期望收入。

第一行乙個正整數 n

接下來 n 個部分

每個部分第一行為正整數 mi,接下來 mi 行有三個整數 aij gij pij

接下來一行 n 個整數,分別為 vi

設 ∑pij=qi,則第 i 個人抽到第 j 張卡的概率為 pij/qi

1<=n,mi<=200,1<=aij<=1000000000,保證 aij 互不相同,0<=gij<=100,1<=pij<=1000,1<=vi<=1000

容易想到算列舉人,列舉他抽的哪張卡,求是第k名的概率。

暴力dp是o(n

4)

o(n^4)

o(n4)的。

發現重複計算很多。

從小到大列舉卡的權值,求這個權值是第k名的概率a

ka_k

ak​。

那麼我們可以轉而求它的生成函式:f(x

)=∑i

=0na

ix

if(x) = \sum_^n a_i x^i

f(x)=∑

i=0n

​ai​

xi可以發現當我們列舉的權值為val

valva

l時。f (x

)=∏i

=1n(

pix+

(1−p

i)

)f(x) = \prod_^n(p_ix+(1-p_i))

f(x)=∏

i=1n

​(pi

​x+(

1−pi

​))p

ip_i

pi​為第i個人抽的卡的值》va

l>val

>va

l的機率。

然後發現在val

valva

l增大時,我們只會改變乘積式中的乙個一次多項式。

一次多項式除法+多項式乘法即可。

注意到這裡的第二個多項式是一次的。

可以o (n

)o(n)

o(n)

(就是做dp)

求出這個生成函式之後,再除一下那個人的多項式就可以統計那個人那個權值的答案。

o (n

3)

o(n^3)

o(n3

)具體看**。

ac code:

#include

#define maxn 405

#define mod 1000000007

using

namespace std;

int n,m[maxn]

,a[maxn]

[maxn]

,g[maxn]

[maxn]

,p[maxn]

[maxn]

,ps[maxn]

,pns[maxn]

,val[maxn]

;int pol[maxn]

,inv[

400005]=

,tmp[maxn]

;int ans[maxn]

;struct node

}q[maxn*maxn]

;int cnt =0;

intpow

(int base,

int k)

void

div(

int p)

}void

mul(

int p)

intmain()

}for

(int i=

2;i<=

300000

;i++

) inv[i]

=1ll

*(mod - mod / i)

* inv[mod % i]

% mod;

for(

int i=

0;i)scanf

("%d"

,&val[i]);

sort

(q+1

,q+1

+cnt)

;for

(int i=

1;i<=cnt;i++

) pns[q[i]

.x]+

= p[q[i]

.x][q[i]

.y];

mul(

1ll* pns[q[i]

.x]* inv[ps[q[i]

.x]]

% mod)

;//for(int j=0;j// printf("pol[%d] = %d\n",j,pol[j]);

}for

(int i=

1;i<=n;i++

)printf

("%d\n"

,(ans[i]

+mod)

%mod)

;}

51nod 1850 抽卡大賽

51nod為了活躍比賽前的氣氛,組織了場抽卡比賽。這場比賽共 n 個人參加,主辦方根據非歐血統鑑定器,得到了一些資料。每個人抽卡有 mi 種可能,得到的卡能力值為 aij 代價為 gij 的可能性為 pij 所謂代價指的是玩家需要將一輪比賽後所得的點頭盾的 gij 交給主辦方。每輪比賽每個人都隨機抽...

多項式 DP 省選模擬51nod抽卡大賽

的dp很容易能想到 定義d p i j k dp i j k dp i j k 表示第i個人選j時,有k個人比它小的概率 然後就能直接算期望了。不過這玩意顯然要t 發現,對於乙個已經固定的i,j,那麼剩下的所有人的所有情況本質上只有2種 比ai,ja ai,j 小,比ai,ja ai,j 大。那麼可...

51nod1702 卡牌遊戲

題目鏈結 最樸素的想法是將圖建出來跑最短路。觀察後發現如下兩條性質 1.邊權是1,可以用廣度優先搜尋代替最短路。2.因為是廣度優先搜尋,每條邊只會被鬆弛一次。但是圖的大小可能是n 2n 2 n2級別的。我們考慮使用線段樹維護隱式圖來支援搜尋。複雜度o n log2 n o nlog 2n o nlo...