题面传送门

首先看到这种求形如 \(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. 【UE4 C++】Input 输入事件绑定

    轴映射与动作映射 编辑器设置input+代码实现具体动作 void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInp ...

  2. Windows10使用技巧

    Windows10配置技巧 新机配置 "我的电脑"图标设置 在桌面右击鼠标=>个性化=>点击左侧"主题"=>点击相关的设置中的"桌面 ...

  3. Beta阶段性总结

    1.题士开发总结 2.反思 2.1 Issue管理 从0522敲定各个功能的API后,团队成员及时沟通,积极开发,但由于开发过程没能有效体现在issue上(如未能及时在issue上形成记录,功能开发完 ...

  4. Spring Cloud Alibaba 介绍及工程准备

    简介 SpringCloud Alibaba是阿里巴巴集团开源的一套微服务架构解决方案. 微服务架构是为了更好的分布式系统开发,将一个应用拆分成多个子应用,每一个服务都是可以独立运行的子工程.其中涵盖 ...

  5. 一套比较好用的公众号UI框架-weui

    最近工作原因 需要在pd端弄一套js类似bootstrap框架 由于使用环境是在公众号终端用的比较多! 类似上面这样的样式 所以我从微信官方开始找起 最后找到了WEUI 还别说 真的挺好用的 这是大佬 ...

  6. 双链路接入(双出口)isp运营商(负载分担)

    USG作为校园或大型企业出口网关可以实现内网用户通过两个运营商访问Internet,并保护内网不受网络攻击. 组网需求 某学校网络通过USG连接到Internet,校内组网情况如下: 校内用户主要分布 ...

  7. Java基础语法5-运算符

    运算符 基本运算符(算术.赋值.关系.逻辑等)不再赘述 位运算符 位运算符&.|.^.~.<<.>> &与 |或 ~非 ^异或 <<左移 >& ...

  8. PHP怎样写延时队列(定时器)

    背景 PHP没有定时器,依托的都是crontab这样的系统工具,也没有go中defer这样的延时方法,本文介绍几种PHP写延时队列的几种姿势. 延时队列的定义 普通的队列是先进先出,但是延时队列并不是 ...

  9. Linux mem 2.5 Buddy 内存回收机制

    文章目录 1. 简介 2. LRU 组织 2.1 LRU 链表 2.2 LRU Cache 2.3 LRU 移动操作 2.3.1 page 加入 LRU 2.3.2 其他 LRU 移动操作 3. LR ...

  10. java框架面试高频问题(SpringMVC)

    1.SpringMVC是什么? 请说出你对它的理解? SpringMVC是Spring将Web层基于MVC封装后的框架. 在没有SpringMVC之前,Web层的Servlet负责的事情很多,很杂.  ...