题面传送门

首先看到这种求形如 \(E(\max(T))\) 的期望题,可以套路地想到 Min-Max 容斥 \(\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-1}\min(T)\),将其转化为容易计算的 \(E(\min(T))\) 进行计算。

不过这题有些不同的一点是我们要求的是第 \(k\) 大而不是最大值,无法直接 Min-Max,这时就要用到一个叫扩展 Min-Max 的东西了,首先抛出式子:\(\max_k(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-k}\dbinom{|T|-1}{k-1}\times\min(T)\),其中 \(\max_k(S)\) 为 \(S\) 中第 \(k\) 大的值。考虑证明,其实和 Min-Max 证明那一套差不多罢,考虑将 \(S\) 中的数从小到大排序 \(a_1,a_2,\cdots,a_n\),我们按照套路枚举 \(\min(T)=a_i\),那么前面那一坨系数等价于选出 \(a_{i+1},a_{i+2}\cdots,a_{n}\) 的一个子集 \(T\),再从 \(T\) 中选 \(k-1\) 个数,贡献 \((-1)^{|T|+1-k}\)(指数上的 \(+1\) 是因为真正的 \(T\) 是我们选出的 \(T\) 与 \(\{a_i\}\) 的并),所有这样的选法的贡献之和,那么我们就考虑换个角度,枚举选出的 \(k-1\) 个数,显然若 \(i>n-k+1\) 贡献就是 \(0\),否则有 \(\dbinom{n-i}{k-1}\) 种选法,再枚举在 \(T\) 中却不再选出的 \(k-1\) 个数的部分 \(S\),那么 \(S\) 显然可以为剩余 \(n-i-(k-1)\) 个数的任意一个子集,这部分的贡献就是 \(\sum\limits_{j=0}^{n-i-(k-1)}\dbinom{n-i-(k-1)}{j}(-1)^{j+(k-1)+1-k}=\sum\limits_{j=0}^{n-i-(k-1)}\dbinom{n-i-(k-1)}{j}(-1)^{j}=[i=n-k+1]\),也就是说只有 \(i=n-k+1\) 时候这部分贡献为 \(1\),其余贡献都是 \(0\),而 \(i=n-k+1\) 时前面那部分贡献刚好也是 \(1\),因此 \(\sum\limits_{T\subseteq S}(-1)^{|T|-k}\dbinom{|T|-1}{k-1}\times\min(T)=a_{n-k+1}\),证毕。

接下来考虑原题,首先本题 \(k\) 的意义实际上是 \(E(\min_k(T))\),因此我们需做一个简单的转化将其变为 \(E(\max_k(T))\) 的形式,即 \(k\leftarrow n-k+1\),而 \(|n-k|\le 10\),也就是说变换后的 \(k\le 11\),刚好。然后考虑怎样计算 \(\max_k(S)\) 的表达式,显然 \(E(\min(T))=\dfrac{m}{\sum\limits_{x\in T}p_x}\)(这里我们假设 \(T\) 为下标集合而不是下表对应的 \(p_i\) 的集合),也就是说虽然集合 \(T\) 的数量可以达到 \(2^n\),但是我们可以将所有 \(E(\min(T))\) 相同的集合 \(T\) 划分在一个等价类中,那么这些集合最多划分为 \(m\) 个等价类,这样就可以 \(dp\) 了,记 \(dp_{i,j,s}\) 为考虑了前 \(i\) 个数,选中的集合上述计算式中的 \(k=j\),\(\sum\limits_{x\in T}p_x=s\),所有这样的集合 \(T\) 的 \((-1)^{|T|-j}\dbinom{|T|-1}{j-1}\) 之和,考虑转移,若 \(i\) 不选择那么显然有 \(dp_{i,j,s}\leftarrow dp_{i-1,j,s}\),否则我们相当于在 \(|T|\) 中加入了一个元素 \(p_i\),应当从 \(dp_{i-1,*,s-p_i}\) 转移来,我们假设 \(T\) 满足 \(T\) 只由前 \(i\) 个数组成,并且 \(\sum\limits_{x\in T}p_x=s-p_i\),那么贡献就说 \(\sum(-1)^{|T|+1-j}\dbinom{|T|}{j-1}\),我们把前面指数上的 \(1\) 提出来,变为 \(\sum-(-1)^{|T|-j}\dbinom{|T|}{j-1}\),再套个组合数递推公式,\(\sum-(-1)^{|T|-j}(\dbinom{|T|-1}{j-1}+\dbinom{|T|-1}{j-2})\),噫,好!这下这东西就容易计算了,因为显然它等于 \(\sum-(-1)^{|T|-j}\dbinom{|T|-1}{j-1}+(-1)^{|T|-j+1}\dbinom{|T|-1}{j-2})\),而你稍微转化一下就能变成 \(-dp_{i-1,j-1,s-p_i}+dp_{i-1,j-2,s-p_i}\),这样就可以在常数时间内实现 \(dp\) 的转移了,即:\(dp_{i,j,s}=dp_{i-1,j,s}-dp_{i-1,j-1,s-p_i}+dp_{i-1,j-2,s-p_i}\)。当然每个数也可以单独成一组,即如果 \(j=1\),那么 \(dp_{i,j,p_i}\leftarrow dp_{i,j,p_i}+1\)。

时空复杂度均为 \(nmk\),由于这题直接开数组大小会达到 \(10^8\),会 \(\text{MLE}\),因此需要用滚动数组/01背包倒序枚举的套路将第一维优化掉,我相信做这一题的人应该不至于不能理解这一步罢……因此就不再赘述了。

代码异常简洁……

const int MAXK=11;
const int MAXM=1e4;
const int MOD=998244353;
int n,k,m,dp[MAXK+5][MAXM+5],inv[MAXM+5];
int main(){
scanf("%d%d%d",&n,&k,&m);k=n+1-k;
for(int i=(inv[1]=1)+1;i<=m;i++) inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1,t;i<=n;i++){
scanf("%d",&t);
for(int l=m;l>=t;l--) for(int j=k;j;j--){
dp[j][l]=(dp[j][l]+(-dp[j][l-t]+dp[j-1][l-t]+MOD)%MOD)%MOD;
} dp[1][t]=(dp[1][t]+1)%MOD;
} int ans=0;
for(int i=1;i<=m;i++) ans=(ans+1ll*dp[k][i]*inv[i]%MOD*m)%MOD;
printf("%d\n",ans);
return 0;
}

洛谷 P4707 - 重返现世(扩展 Min-Max 容斥+背包)的更多相关文章

  1. 洛谷P4707 重返现世 [DP,min-max容斥]

    传送门 前置知识 做这题前,您需要认识这个式子: \[ kthmax(S)=\sum_{\varnothing\neq T\subseteq S}{|T|-1\choose k-1} (-1)^{|T ...

  2. 洛谷 P4707 重返现世

    洛谷 P4707 重返现世 k-minimax容斥 有这一个式子:\(E(\max_k(S))=\sum_{T\subseteq S}(-1)^{|T|-k}C_{|T|-1}^{k-1}\min(T ...

  3. 【题解】洛谷P4707重返现世

    在跨年的晚上玩手机被妈妈骂了赶来写题……呜呜呜……但是A题了还是很开心啦,起码没有把去年的题目留到明年去做ヾ(◍°∇°◍)ノ゙也祝大家2019快乐! 这题显然的 kth min-max 容斥就不说了, ...

  4. 洛谷P4707 重返现世(扩展MinMax容斥+dp)

    传送门 我永远讨厌\(dp.jpg\) 前置姿势 扩展\(Min-Max\)容斥 题解 看纳尔博客去→_→ 咱现在还没搞懂为啥初值要设为\(-1\)-- //minamoto #include< ...

  5. [洛谷P4707] 重返现世

    Description 为了打开返回现世的大门,\(Yopilla\) 需要制作开启大门的钥匙.\(Yopilla\) 所在的迷失大陆有 \(n\) 种原料,只需要集齐任意 \(k\) 种,就可以开始 ...

  6. P4707 重返现世 扩展 MinMax 容斥+DP

    题目传送门 https://www.luogu.org/problem/P4707 题解 很容易想到这是一个 MinMax 容斥的题目. 设每一个物品被收集的时间为 \(t_i\),那么集齐 \(k\ ...

  7. POJ 1741.Tree and 洛谷 P4178 Tree-树分治(点分治,容斥版) +二分 模板题-区间点对最短距离<=K的点对数量

    POJ 1741. Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 34141   Accepted: 11420 ...

  8. 洛谷P5206 [WC2019] 数树(生成函数+容斥+矩阵树)

    题面 传送门 前置芝士 矩阵树,基本容斥原理,生成函数,多项式\(\exp\) 题解 我也想哭了--orz rqy,orz shadowice 我们设\(T1,T2\)为两棵树,并定义一个权值函数\( ...

  9. 洛谷 P4336 黑暗前的幻想乡 —— 容斥+矩阵树定理

    题目:https://www.luogu.org/problemnew/show/P4336 当作考试题了,然而没想出来,呵呵. 其实不是二分图完美匹配方案数,而是矩阵树定理+容斥... 就是先放上所 ...

随机推荐

  1. 代码混淆保安全「GitHub 热点速览 v.21.43」

    作者:HelloGitHub-小鱼干 虽然让代码难以阅读看似是件难以理解的事情,但是混淆后的代码起到了类似加密的作用,而且经过混淆的代码依旧能实现原代码的功能.javascript-obfuscato ...

  2. TreeSet和TreeMap中“相等”元素可能并不相等

    TreeSet和TreeMap元素之间比较大小是借助Comparator对象的compare方法. 但有些时候,即便compare()返回0也不意味着这两个元素直观上相同. 比如元素是二元组[a,b] ...

  3. Redis:学习笔记-03

    Redis:学习笔记-03 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 7. Redis配置文件 启动 ...

  4. poi实现生成下拉选联动

    在我们实际的程序开发中,经常需要用到从excel导入数据中系统中,而为了防止用户在excel中乱输入文字,有些需要用到下拉选的地方,就需要从程序中动态生成模板.本例子简单的讲解一下,如何生成级联下拉选 ...

  5. Spring Security:Servlet 过滤器(三)

    3)Servlet 过滤器 Spring Security 过滤器链是一个非常复杂且灵活的引擎.Spring Security 的 Servlet 支持基于 Servlet 过滤器,因此通常首先了解过 ...

  6. Spark面试题整理(三)

    1.为什么要进行序列化序列化? 可以减少数据的体积,减少存储空间,高效存储和传输数据,不好的是使用的时候要反序列化,非常消耗CPU. 2.Yarn中的container是由谁负责销毁的,在Hadoop ...

  7. Docker安装配置Tomcat

    1.使用docker pull tomcat下载镜像(不加tag则是下载最新版本) 2.运行容器(-d 后台运行:-p 指定端口映射),接的是镜像ID 3.进入容器执行命令,接的是容器ID 4.宿主机 ...

  8. Java 在PPT中创建散点图

    本文将以Java代码示例展示如何在PPT幻灯片中创建散点图表. 创建图表前 需要在Java程序中导入用于操作PPT的jar包 Free Spire.Presentation for Java.可参考如 ...

  9. TCP/IP概述(网络互联与TCP/IP)

    TCP/IP概述(网络互联与TCP/IP) 用IP实现异构网络互联 从用户角度如何实现异构网络互联: 从用户角度看,实现异构网络互联的关键点就是使各种网络类型之间的差异对自己透明.在TCP/IP协议中 ...

  10. Qt Creator 常用快捷键 详细总结

    下面是我总结的一些Qt Creator 常用快捷键 ,可以大大提高我们使用Qt开发项目的效率!! Qt Creator 常用快捷键 快捷键 介绍 F1 查看帮助文档 Shift + F2 函数的声明和 ...