码迷,mamicode.com
首页 > 其他好文 > 详细

CTSC 2018

时间:2018-11-22 15:16:12      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:--   alc   none   math   max   spl   思路   题目   std   

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 \times p_{没死} + a[cur]_{i+1} \times p_{死了}$

2操作 先求出每个人的存活率 可以想到一个非常简单的$n^3$算法

设$h_i$表示有$i$个人存活的概率 $g_i$表示第 $i$个人存活的概率

对于第 $i$ 个人 $h[cur]_j = a[cur\space xor\space 1]_j \times (1-g_i) + a[cur]_{i-1} \times 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 }
View Code

 

CTSC 2018

标签:--   alc   none   math   max   spl   思路   题目   std   

原文地址:https://www.cnblogs.com/yyc-jack-0920/p/10001001.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!