CTSC 2018
Posted yyc-jack-0920
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CTSC 2018相关的知识,希望对你有一定的参考价值。
T1 假面
题目大意:
n个人,每个人有$a_i$血量 支持两个操作
1 有$u/v$的概率使第a个人掉一滴血
2 给出k个数$k_i$ 设这k个人中有x个人还活着 则选中每个活着的人的概率为$1/x$
对于每个2操作输出选中每个人的输出
最后输出每个人的期望血量
思路:
唯一一道可以想出来的题 模拟一下每个人有几滴血的概率 对于1操作非常简单
每个人的血量数组从 $a[cur]_i = a[cur space xor space 1]_i imes p_{没死} + a[cur]_{i+1} imes p_{死了}$
2操作 先求出每个人的存活率 可以想到一个非常简单的$n^3$算法
设$h_i$表示有$i$个人存活的概率 $g_i$表示第 $i$个人存活的概率
对于第 $i$ 个人 $h[cur]_j = a[curspace xorspace 1]_j imes (1-g_i) + a[cur]_{i-1} imes g_i$
考虑优化 我们计算删除一个数对答案数组的影响
把式子倒着推过去即可得到删除这个数的数组 然后就优化到了$n^2$
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7 #include<vector> 8 #include<queue> 9 #include<map> 10 #define ll long long 11 #define inf 2139062143 12 #define MAXN 310 13 #define MOD 998244353 14 #define rep(i,l,r) for(register int i=l;i<=r;i++) 15 #define dwn(i,l,r) for(register int i=l;i>=r;i--) 16 using namespace std; 17 inline int read() 18 { 19 int x=0,f=1;char ch=getchar(); 20 while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();} 21 while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();} 22 return x*f; 23 } 24 inline ll q_pow(ll bas,ll t) 25 { 26 ll res=1; 27 for(;t;t>>=1,(bas*=bas)%=MOD) 28 if(t&1) (res*=bas)%=MOD; 29 return res; 30 } 31 inline ll inv(ll x) {return q_pow(x,MOD-2);} 32 inline ll add(ll a,ll b) {return a+b>=MOD?a+b-MOD:a+b;} 33 int n,q,tmp[MAXN],las[MAXN]; 34 ll p[2][MAXN][MAXN],hp[MAXN],g[MAXN],h[2][MAXN],Inv[MAXN]; 35 inline ll calc(int x,int t,int r) {ll res=0;rep(i,0,r) res=add((h[x][i]*Inv[i+1])%MOD,res);return (res*g[t])%MOD;} 36 inline ll get(int x) {ll res=0;rep(i,1,hp[x]) res=add(res,(i*p[las[x]][x][i])%MOD);return res;} 37 int main() 38 { 39 freopen("faceless.in","r",stdin); 40 freopen("faceless.out","w",stdout); 41 n=read();rep(i,1,n) hp[i]=read(),p[0][i][hp[i]]=1,Inv[i]=inv(i); 42 int a,b,c,k,cur,t;q=read(); 43 while(q--) 44 { 45 a=read(); 46 if(!a) 47 { 48 a=read(),b=read(),c=read(),las[a]^=1,k=las[a],t=inv(c); 49 rep(i,0,hp[a]) p[k][a][i]=add(((p[k^1][a][i]*(c-b))%MOD*t)%MOD,((p[k^1][a][i+1]*b)%MOD*t)%MOD); 50 } 51 else 52 { 53 k=read(),cur=0;rep(i,1,k) tmp[i]=read(),g[i]=0; 54 rep(i,1,k) rep(j,1,200) g[i]=add(g[i],p[las[tmp[i]]][tmp[i]][j]); 55 h[0][0]=1;rep(i,1,k) h[0][i]=h[1][i]=0; 56 rep(j,2,k) if(g[j]) {rep(o,0,k) h[cur^1][o]=add((h[cur][o]*(1-g[j]+MOD))%MOD,o?(h[cur][o-1]*g[j])%MOD:0LL);cur^=1;} 57 printf("%lld ",calc(cur,1,k)); 58 rep(i,2,k) 59 { 60 t=inv(1-g[i]+MOD); 61 h[cur^1][0]=(h[cur][0]*t)%MOD; 62 if(g[i]==1) {rep(o,0,k) h[cur^1][o]=h[cur][o+1];h[cur^1][k]=0;} 63 else if(g[i]&&g[i]!=1) rep(o,1,k) h[cur^1][o]=((MOD+h[cur][o]-(h[cur^1][o-1]*g[i])%MOD)%MOD*t)%MOD; 64 if(g[i-1]) rep(o,0,k) h[cur][o]=add((h[cur^1][o]*(1-g[i-1]+MOD))%MOD,o?(h[cur^1][o-1]*g[i-1])%MOD:0LL); 65 printf("%lld",calc(cur,i,k));if(i!=k) printf(" "); 66 } 67 puts(""); 68 } 69 } 70 rep(i,1,n) {printf("%lld",get(i));if(i!=n) printf(" ");}puts(""); 71 fclose(stdout);return 0; 72 }
以上是关于CTSC 2018的主要内容,如果未能解决你的问题,请参考以下文章