P4564 假面 題解

2022-03-12 11:39:33 字數 1451 閱讀 1263

這個 ctsc 的題竟然是我自己想出來的,incredible(

portal

分為兩個問題:求每個結界技能每個攻擊物件被命中的概率,和求最終每個敵方單位的期望生命值。先考慮後者。

顯然只有鎖定技能能夠造成傷害。我們設敵方單位 \(i\) 被命中的鎖定技能個數為 \(x\)。將式子列出來:\(\mathrm e(\max(0,a_i-x))\)。這個外面套了乙個 \(\max\),不好線性性展開。於是我們考慮通過期望的定義,求出每個取值的概率。顯然取值個數是 \(\mathrm o(v)\) 的,其中 \(v\) 是值域大小。於是我們可以對每個 \(i\) 搞乙個揹包:\(dp_\) 表示敵方單位 \(i\) 在當前時刻生命值為 \(j\) 的概率,在新加進乙個鎖定技能的時候更新揹包的 dp 陣列即可。這樣一次更新是 \(\mathrm o(v)\) 的,這一部分就是 \(\mathrm o(qv)\)。最後統計一下答案即可。

然後考慮前乙個問題。每個敵方單位被命中,首先要他自己還活著,然後根據活著的總人數來確定他在當前情況下被命中的概率。設他活著的情況下,剩下 \(i\) 個人活著的概率為 \(p_i\),那麼總概率就是 \(\sum \dfrac 1ip_i\)。那麼我們考慮求出每個敵方單位所對應的 \(p\) 陣列。

顯然有乙個大暴力:對於每個人都跑一遍揹包(\(dp0_\) 表示當前不算第 \(i\) 個人的情況下,考慮到當前,有 \(j\) 個人活著的概率,然後轉移用每個人存活的概率,這個可以通過當前 \(dp\) 陣列得到),這樣一次揹包是 \(\mathrm o\!\left(n^2\right)\) 的,總複雜度就是 \(\mathrm o\!\left(cn^3\right)\),再優化掉乙個 \(n\) 就可以了。

我們注意到,每個人所對應的揹包,是所有人減去他乙個人的。那麼能否先算出所有人的,再對於每個人,減去他自己這個人呢?也就是揹包是否可逆呢?顯然,如果要去掉的人是總揹包 dp 過程中的最後乙個更新它的人,那顯然很好去掉,倒推一下即可。而眾所周知,揹包是順序無關的,也就是你可以當作它以任意乙個人結尾,那就對於每個人就可以倒推了。

講一下倒推的方法:設更新前的 dp 陣列為 \(dp0\),更新後為 \(dp0'\),那我們想要通過 \(dp0'\) 知道 \(dp0\)。轉移顯然是

\[dp0'_j=(1-alive_i)dp0_j+alive_idp0_

\]其中 \(alive_i\) 是第 \(i\) 個人(也就是假定的最後乙個更新的人)存活的概率。那麼

\[dp0_j=\dfrac}

\]但是這裡還有乙個問題:\(1-alive_i\) 可能等於 \(0\),也就是 \(alive_i=1\)。這個需要特判一下。事實上這個簡單的一批,不難得到

\[dp0_j=dp0'_

\]於是總複雜度 \(\mathrm o\!\left(qv+cn^2\right)\)。要注意預處理一些逆元,不然複雜度就多了個 \(\log\)。

code

假面舞會 題解

題目描述 一年一度的假面舞會又開始了,棟棟也興致勃勃的參加了今年的舞會。今年的面具都是主辦方特別定製的。每個參加舞會的人都可以在入場時選擇一 個自己喜歡的面具。每個面具都有乙個編號,主辦方會把此編號告訴拿該面具的人。為了使舞會更有神秘感,主辦方把面具分為k k 3 類,並使用特殊的技術將每個面具的編...

題解 P2058 海港

我們注意到資料範圍,發現二維陣列並不可取,但是我們又注意到 k i 3 105 ki 3 10 5,所以採取一種新的思想 將所有人都讀在乙個一維陣列裡面 使用乙個佇列 q q 來儲存第 i role presentation i i艘船上人數的範圍,即 q q 儲存的是兩個數 l r role pr...

題解 P4995 跳跳!

說實話這個題我一開始想了好久dfs超時得了30可能因為我太弱了 吃得苦中苦方為人上人現在終於a了當然體會更多 1 首先 這是個真的真的貪心題 貪心思路就是每次都從未跳過得最高的 或最低的 跳到最低處 最高處 這樣差值才最大 2 知道貪心思路了就要寫好 qaq 寫法有很多種,像我這種蒟蒻就只會寫這一種...