CTSC2018 假面 01揹包的刪除

2021-08-20 00:24:46 字數 2022 閱讀 1497

首先記錄ai

,ja i,

j表示單位

i i

生命值為

j' role="presentation" style="position: relative;">j

j的概率,那麼每次修改可以o(

m)o (m

)。

對於詢問,先求出ex

i=∑m

ij=1

ai,j

e xi

=∑j=

1mia

i,

j表示單位

i i

存活的概率。那麼我們只要對於每乙個單位

i' role="presentation" style="position: relative;">i

i,求出除了該單位的剩下k−

1 k−1

個單位中,有

1..k−1

1..k−1

個單位的存活的概率就解決了。 設f

i,j fi,

j表示考慮前

i i

個單位,其中

j' role="presentation" style="position: relative;">j

j個單位存活的概率,轉移一輪是o(

n2) o(n

2)

的,因為對於每個單位都要轉移一輪,所以是o(

n3) o(n

3)

。 因為每輪轉移都只有自己沒有參與轉移,考慮如何從01揹包中刪除乙個元素。

新增乙個元素f′

k=fk

−1⋅e

xi+f

k⋅(1

−exi

) fk′

=fk−

1⋅ex

i+fk

⋅(1−

exi)

。 那麼刪除乙個元素就是fk

=f′k

−fk−

1∗ex

i1−e

xif k=

fk′−

fk−1

∗exi

1−ex

i。

只需要先把所有的轉移一遍,再分別刪除每乙個即可。注意處理ex

i=1 exi

=1

的情況,總複雜度o(

qm+c

n2) o(q

m+cn

2)

。 **:

#include

#include

#include

#include

#define n 210

#define m 110

#define ll long long

using namespace std;

const int mod=998244353;

int n,c[n],q,t[n];

ll a[n][m],f[n][n],g[n],ex[n],ans[n],inv[n];

ll ksm(ll a,ll b)return r;}

intread()

int main()

for(int j=1;j<=m;j++)

ans[i]=(ans[i]+ex[i]*g[j-1]%mod

*inv[j])%mod;

} for(int i=1;i<=m;i++)

printf("%lld ",ans[i]);

puts("");

}else

}for(int i=1;i<=n;i++)

ans[i]=0;

for(int i=1;i<=n;i++)

for(int j=1;j<=c[i];j++)

ans[i]=(ans[i]+a[i][j]*j)%mod;

for(int i=1;i<=n;i++)

printf("%lld ",ans[i]);

puts("");

return

0;}

CTSC2018 假面 期望 DP

loj 2552 luogu p4564 考場上這道題我先是寫了個70分暴力,然後發現似乎可以ntt,然鵝問題是 我沒學過ntt,遂腦補之,腦補出來了,下午出成績一看,卡成暴力分 70 同是 o qk 2 log k 學姐的拉格朗日什麼玩意就能過tat 學姐太強了 遂不忿,今天上午重寫ntt,努力卡...

01揹包(多個揹包的組合)

kkksc03的大學生活非常的頹廢,平時根本不學習。但是,臨近期末考試,他必須要開始抱佛腳,以求不掛科。這次期末考試,kkksc03需要考4科。因此要開始刷習題集,每科都有乙個習題集,分別有s1,s2,s3,s4道題目,完成每道題目需要一些時間,可能不等 a1.as1,b1.bs2,c1.cs3,d...

常見的揹包問題 01揹包和完全揹包

有 n 件物品和容量為 m 的揹包,給出 n 件物品的重量 w i 以及價值 c i 求解讓裝入揹包的物品重量不超過揹包容量且價值最大,每個物品只能選擇一次 暴力解法 暴力列舉每件物品要不要放入揹包,時間複雜度o 2 n 顯然是不能接受的,而使用 dp 可以將時間複雜度變成o nm 動態規劃 用dp...