UOJ #399. 【CTSC2018】假面
题面传送门
垃圾选手写了个单次询问\(O(n^3)\)的垃圾做法发现过了/jy
首先我们发现这个血量的值域很小,显然可以每次修改暴力背包出\(dp_{i,j}\)表示第\(i\)个数血量为\(j\)的概率。
然后因为询问不是很多所以考虑一些高复杂度的dp。
设\(f_{i,j}\)表示前\(i\)个数,有\(j\)个存活的概率,套路是维护前缀和后缀背包然后暴力合并,时间复杂度\(O(n^3)\)。貌似可以暴力卷积做到\(O(n^2\log n)\)
但是实际不必要,发现除了一个钦定必选其它是不变的,所以每次可以撤销这个数。
但是因为概率有0撤销要讨论所以垃圾275307894a并不想写。所以只有一份\(O(Cn^3+Qm)\)的代码。
code:
#include<bits/stdc++.h>
#define I inline
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define ll long long
#define db double
#define lb long db
#define N (200+5)
#define M (1000000+5)
#define K (20+5)
#define mod 998244353
#define Mod (mod-1)
#define eps (1e-9)
#define U unsigned int
#define it iterator
#define Gc() getchar()
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) (n*(x-1)+(y))
#define R(n) (rand()*rand()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using namespace std;
int n,m,k,A[N],op,x,y,z,Maxn;ll ToT,Ans,Inv[N],dp[N][N],B[N],F1[N][N],F2[N][N];
I ll mpow(ll x,int y=mod-2){ll Ans=1;while(y) y&1&&(Ans=Ans*x%mod),y>>=1,x=x*x%mod;return Ans;}
int main(){
freopen("1.in","r",stdin);freopen("1.out","w",stdout);
int i,j,h;Inv[0]=1;scanf("%d",&n);for(i=1;i<=n;i++) scanf("%d",&A[i]),dp[i][A[i]]=1,Inv[i]=mpow(i);
scanf("%d",&m);while(m--){
scanf("%d",&op);if(!op){scanf("%d%d%d",&x,&y,&z);y=1ll*y*mpow(z)%mod;for(i=0;i<=A[x];i++) dp[x][i]=((i?(1+mod-y)*dp[x][i]:dp[x][i])+y*dp[x][i+1])%mod;continue;}
scanf("%d",&k);for(i=1;i<=k;i++) scanf("%d",&x),B[i]=mod+1-dp[x][0];Me(F1,0);Me(F2,0);F1[0][0]=1;for(i=1;i<=k;i++) for(j=0;j<=i;j++) F1[i][j]=(F1[i-1][j]*(1+mod-B[i])+(j?(F1[i-1][j-1]*B[i]):0))%mod;
F2[k+1][0]=1;for(i=k;i;i--) for(j=0;j<=k-i+1;j++) F2[i][j]=(F2[i+1][j]*(1+mod-B[i])+(j?(F2[i+1][j-1]*B[i]):0))%mod;
for(i=1;i<=k;printf("%lld ",ToT%mod*B[i]%mod),i++) for(ToT=j=0;j<i;j++) for(h=0;h<k-i+1;h++) ToT+=Inv[j+h+1]*F1[i-1][j]%mod*F2[i+1][h]%mod;Pc('\n');
}for(i=1;i<=n;printf("%lld ",ToT%mod),i++) for(ToT=0,j=1;j<=A[i];j++) ToT+=dp[i][j]*j%mod;
}

浙公网安备 33010602011771号