题面传送门

首先看到这种求形如 \(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. JVM:体系结构

    JVM:体系结构 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 概览 Java GC 主要回收的是 方法区 和 堆 中的内容 类加载器 类加载器是什么 双亲委派 ...

  2. Beta_Scrum Meeting_0

    日期:2021年5月26日 参会人员:cy.hcc.lsc.dxh 会议主题:为Beta阶段最早两日的开发制定目标 一.进度情况 组员 负责 两日内完成的任务 接下来两日预计完成的任务 hcc 前端 ...

  3. Scrum Meeting 0425

    零.说明 日期:2021-4-25 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成登录.注册A ...

  4. [技术博客]在团队中使用Pull Request来管理代码

    在团队中使用Pull Request来管理代码 前言 在参加多人共同开发项目,且选用Git作为代码托管工具的时候,我们不免会遇到分支冲突.覆盖.合并等问题.显然,因为同一个仓库是属于大家的,所以每个人 ...

  5. C++链表常见面试考点

    链表常见问题: 单链表找到倒数第n个节点 用两个指针指向链表头,第一个指针先向前走n步,然后两个指针同步往前走,当第一个指针指向最后一个节点时,第二个指针就指向了倒数第n个节点. 判断链表有没有环 快 ...

  6. 用C++实现的数独解题程序 SudokuSolver 2.6 的新功能及相关分析

    SudokuSolver 2.6 的新功能及相关分析 SudokuSolver 2.6 的命令清单如下: H:\Read\num\Release>sudoku.exe Order please: ...

  7. 同人逼死官方系列!从 DDC 嗅探器到 sddc_sdk_lib 的数据解析

    从 DDC 嗅探器到 sddc_sdk_lib 的数据解析 之前的 DDC 协议介绍 主要讲了设备加入.退出以及维持设备状态,而 SDK框架 sddc_sdk_lib 解析 主要讲了 SDK 库的结构 ...

  8. 转载:使用Xilinx IP核进行PCIE开发学习笔记(一)简介篇

    https://zhuanlan.zhihu.com/p/32786076 最近接触到一个项目,需要使用PCIE协议,项目要求完成一个pcie板卡,最终可以通过电脑进行通信,完成电脑发送的指令.这当中 ...

  9. shell 脚本静默安装oracle11g

    以下脚本的手动安装连接:  https://www.cnblogs.com/leihongnu/p/12698593.html [ #/bin/bash#安装日志touch /root/message ...

  10. 《手把手教你》系列技巧篇(三十九)-java+ selenium自动化测试-JavaScript的调用执行-上篇(详解教程)

    1.简介 在做web自动化时,有些情况selenium的api无法完成,需要通过第三方手段比如js来完成实现,比如去改变某些元素对象的属性或者进行一些特殊的操作,本文将来讲解怎样来调用JavaScri ...