题面链接

LOJ

sol

好神啊。果然\(dp\)还是做少了,纪录一下现在的思维吧\(QAQ\)。

我们首先可以发现期望是骗人的,要不然他乘的是什么xjb玩意。

其实就是要求所有方案的最优方案和。

因为\(w_i\)是大于1的,所以能强化先强化,再从大往小打攻击牌。

那么我们枚举用了\(a\)张强化,\(b\)张攻击。

若\(a<k\),显然强化牌选完,攻击牌从大到小。

否则,选前\(k-1\)大的强化牌,再选最大的攻击牌。

我们如何做到最优呢,这里有一个套路,先排序,这样可以保证每一种方案这一定是最优的。

设\(f[i][j]\)表示用了\(i\)张强化牌最后一张是第\(j\)张的所有的方案的乘积。

设\(g[i][j]\)表示用了\(i\)张攻击牌最后一张是第\(j\)张的所有的方案的和。

注意我们是求所有的方案。

设\(F[i][j]\)表示取了\(i\)张强化牌,用了\(j\)张的方案的乘积。

设\(G[i][j]\)表示取了\(i\)张攻击牌,用了\(j\)张的方案的和。

那么有

\[F[x][y]=\sum_{i=1}^nf[y][i]*\binom{n-i}{x-y}
\]

\[G[x][y]=\sum_{i=1}^ng[y][i]*\binom{n-i}{x-y}
\]

一张强化牌都不能要的时候。\(F[x][y]=\binom{n}{x}\)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define gt getchar()
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
inline int in()
{
int k=0;char ch=gt;
while(ch<'-')ch=gt;
while(ch>'-')k=k*10+ch-'0',ch=gt;
return k;
}
const int N=3005,YL=998244353;
inline int MO(const int &a){return a>=YL?a-YL:a;}
inline int ksm(int a,int k){int r=1;while(k){if(k&1)r=1ll*r*a%YL;a=1ll*a*a%YL,k>>=1;}return r;}
int f[N][N],g[N][N],a[N],b[N],sum[N],fac[N],fnv[N],n,m,k;
inline int C(int x,int y){return y>x?0:1ll*fac[x]*fnv[y]%YL*fnv[x-y]%YL;}
inline int qh(int x,int y)
{
if(y>x)return 0;if(!y)return C(n,x);
int res=0;
for(int i=1;i<=n;++i)
res=MO(res+1ll*f[y][i]*C(n-i,x-y)%YL);
return res;
}
inline int gj(int x,int y)
{
if(y>x)return 0;if(!y)return 0;
int res=0;
for(int i=1;i<=n;++i)
res=MO(res+1ll*g[y][i]*C(n-i,x-y)%YL);
return res;
}
int main()
{
fac[0]=fnv[0]=1;
for(int i=1;i<=3000;++i)fac[i]=1ll*fac[i-1]*i%YL;fnv[3000]=ksm(fac[3000],YL-2);
for(int i=3000;i>=1;--i)fnv[i-1]=1ll*fnv[i]*i%YL;
int t=in();
while(t--)
{
n=in(),m=in(),k=in();
for(int i=1;i<=n;++i)a[i]=in();
for(int i=1;i<=n;++i)b[i]=in();
std::sort(a+1,a+n+1,std::greater<int>());
std::sort(b+1,b+n+1,std::greater<int>());
for(int i=1;i<=n;++i)f[1][i]=a[i],sum[i]=MO(sum[i-1]+a[i]);
for(int i=2;i<=n;++i)
{
for(int j=1;j<=n;++j)f[i][j]=1ll*a[j]*sum[j-1]%YL;
for(int j=1;j<=n;++j)sum[j] =MO(sum[j-1]+f[i][j]);
}
for(int i=1;i<=n;++i)g[1][i]=b[i],sum[i]=MO(sum[i-1]+b[i]);
for(int i=2;i<=n;++i)
{
for(int j=1;j<=n;++j)g[i][j]=MO(1ll*b[j]*C(j-1,i-1)%YL+sum[j-1]);
for(int j=1;j<=n;++j)sum[j] =MO(sum[j-1]+g[i][j]);
}
int ans=0;
for(int a=0,t=std::min(n,m);a<=t;++a)
{
int b=m-a;if(b>n||b<0)continue;
ans=MO(ans+(a<k?1ll*qh(a,a)*gj(b,k-a)%YL:1ll*qh(a,k-1)*gj(b,1)%YL));
}
printf("%d\n",ans);
}
return 0;
}

PKUWC Slay The Spire的更多相关文章

  1. LOJ #2538. 「PKUWC 2018」Slay the Spire (期望dp)

    Update on 1.5 学了 zhou888 的写法,真是又短又快. 并且空间是 \(O(n)\) 的,速度十分优秀. 题意 LOJ #2538. 「PKUWC 2018」Slay the Spi ...

  2. BZOJ 5467 Slay the Spire

    BZOJ 5467 Slay the Spire 我的概率基础也太差了.jpg 大概就是这样,因为强化牌至少翻倍,所以打出的牌必定是全部的强化牌或者$k-1$个强化牌,然后剩余的机会打出最大的几个攻击 ...

  3. loj #2538. 「PKUWC2018」Slay the Spire

    $ \color{#0066ff}{ 题目描述 }$ 九条可怜在玩一个很好玩的策略游戏:Slay the Spire,一开始九条可怜的卡组里有 \(2n\) 张牌,每张牌上都写着一个数字\(w_i\) ...

  4. loj2538 「PKUWC 2018」Slay the Spire

    pkusc 快到了--做点题涨涨 rp. ref我好菜啊QAQ. 可以发现期望只是一个幌子.我们的目的是:对于所有随机的选择方法(一共 \(\binom{2n}{m}\)种),这些选择方法都最优地打出 ...

  5. [LOJ #2538][PKUWC 2018]Slay the Spire

    题目大意:一开始有 $2n$ 张牌,每张牌上都写着一个数字 $w_i$,有两种的牌,每种类型各 $n$ 张: 1.攻击牌:打出后对对方造成牌上的数字的伤害. 2.强化牌:打出后,设数字为 $x$,则其 ...

  6. 【loj2538】 【PKUWC 2018】Slay the Spire dp

    我们不难发现,假设抽了x张攻击牌,y张强化牌,那么肯定是打出尽可能多张的强化牌后,再开始出攻击牌(当然最少要一张攻击牌) 我们设G(i,j)表示:所有(抽到的攻击牌牌数为i,打出的攻击牌牌数为j)的方 ...

  7. BZOJ.5467.[PKUWC2018]Slay the Spire(DP)

    LOJ BZOJ 洛谷 哪张能力牌能乘攻击啊,太nb了叭 显然如果有能力牌,那么应该选最大的尽可能的打出\(k-1\)张. 然后下面说的期望都是乘总方案数后的,即所有情况的和.然后\(w_i\)统一用 ...

  8. [PKUWC2018] Slay the spire

    Description 现在有 \(n\) 张强化牌和 \(n\) 张攻击牌: 攻击牌:打出后对对方造成等于牌上的数字的伤害. 强化牌:打出后,假设该强化牌上的数字为 \(x\),则其他剩下的攻击牌的 ...

  9. 题解-PKUWC2018 Slay the Spire

    Problem loj2538 Solution 在考场上当然要学会写暴力,考虑如果手上已经有了\(a\)张攻击牌和\(b\)张强化牌: 首先强化牌会在攻击牌之前用(废话),其次要将两种牌分别从大往小 ...

随机推荐

  1. 【snaptype nexus】搭建maven私服仓库

    搭建本地开发私库,旨在解决本地开始受限于网络环境的问题:具体的搭建步骤主要包含以下几个步骤: 1.私服服务器使用的是ubuntu,首先下载安装包(版本号:2.12),下载地址:http://www.s ...

  2. DICOM 协议学习笔记之 What is DICOM

    什么是DICOM? Dicom (Digital Imaging and Communications in Medicine)即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052 ...

  3. 2018NOIP爆0记第二弹之day1

    出门进了电梯 白底黑字的告示上只有一句话 善待你一生. 湖上的白天鹅和白鹭远远厮混成一点,抱着玻璃杯里装着的小菊花,又慢悠悠溜达去了实验楼. t1 原本写过原题,结果考场上死去活来也只搞出了个nlog ...

  4. zabbix切换中文,监控图下方显示乱码,监控图X轴不显示时间问题解决(适用于所有版本)

    一.现象: abbix3.4安装好后添加zabbix图形,发现有好多方块 这是因为zabbix web程序缺少中文字体 二.解决方案1: 1.在windows系统找一个中文字体上传到服务器中,我这里找 ...

  5. python编辑选课系统

    一.需求分析 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 3. 课程包含,周期,价格,通过学校创建课 ...

  6. 新手Python第一天(接触)

    Python 变量 Python的变量由字母,数字,下划线组成不包含特殊字符,不能以数字开头 可以使用的名称 例如:name,name2,my_name 不可使用的名称 例如:if...(Python ...

  7. 打包一个传统的ASP.NET web app作为Docker镜像

    (1)针对NerdDinner应用的Dockerfile内容如下 PS E:\DockeronWindows\Chapter02\ch02-nerd-dinner> cat .\Dockerfi ...

  8. visudo命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/ImJerryChan/p/6667819.html 目录前言一.介绍二.配置文件简介三.实战配置 前言:    su ...

  9. 马赛克是否无法逆转?Python简单消除,看片无忧!

    图片水印,轻松去除 前段时间玩过了全民K歌,不知道大家是否玩过,还是做得挺好的,就我这嗓子都能唱出张学友的味道,其中更是有消除噪声的功能,就是朋友们都在吃鸡大叫,我在旁边唱歌依然不受影响. 既然声音可 ...

  10. 使用sass与compass合并雪碧图(二)

    上一篇文章介绍了怎样使用compass合并雪碧图,生成的icons.css文件中单位是px,PC端可以直接在html文件中使用,但在移动端,我们需要根据不同分辨率的屏幕,来缩放图片大小,显然使用px单 ...