题目传送门

https://www.luogu.org/problem/P4707

题解

很容易想到这是一个 MinMax 容斥的题目。

设每一个物品被收集的时间为 \(t_i\),那么集齐 \(k\) 个物品所需时间就是 \(\{t_i\}\) 中的第 \(n-k+1\) 大的时间。

所以我们不妨把 \(k\) 看成原来的 \(n-k+1\),这个 \(k \leq 11\)。

然后根据扩展 MinMax 容斥
\[ \max_k (S) = \sum_{T \subseteq S, |T| \geq k} (-1)^{|T| - k} \binom{|T|-1}{k-1}min(T) \]
以及期望的线性性质有
\[ E(\max_k (S)) = \sum_{T \subseteq S, |T| \geq k} (-1)^{|T| - k} \binom{|T|-1}{k-1}E(min(T)) \]
所以我们需要做到的就是求出右边的东西。


因为 \(E(\min(T)) = \frac{m}{\sum\limits_{i\in T} p_i}\),又因为 \(\sum\limits_{i\in T} p_i \leq m \leq 10000\),而且有用的只有 \(\sum_{i\in T}p_i\),所以我们很容易得到一个 \(O(n^2m)\) 的做法。

令 \(dp[i][j][k]\) 表示在前 \(i\) 个数中选出来一个大小为 \(k\) 的集合,这个集合的 \(p_i\) 之和为 \(j\) 的总方案。

转移的时候可以类似于 01 背包来转移。
\[ dp[i][j][k] = dp[i-1][j][k]+dp[i-1][j-p_i][k-1] \]
最后答案就是
\[ \sum_{i=k}^n (-1)^{i-k}\binom{i-1}{k-1}\sum_{j=1}^m \frac {dp[n][j][i] \cdot m}{j} \]
然而不管这个做法多么好想,它毕竟是 \(O(n^2m)\) 的,只可以通过 \(70\%\) 的测试数据。


我们发现题目中有一个非常重要的条件我们没有用上:\(k \leq 11\)。

可是容斥的时候,\(|T| \geq k\),这个 \(k\) 的范围完全没有用武之地啊。

回顾前面的 dp 的过程。如果选了一个 \(\sum\limits_{i\in T} p_i = j\) 的集合 \(T\),并且 \(i \in T\),那么它是从一个 \(p\) 之和为 \(j - p_i\) 大小为 \(|T|-1\) 的集合转移而来的。

因为一个 \(\sum\limits_{i\in T} p_i = j\) 的集合 \(T\) 的贡献为 \(\sum\limits_{\sum\limits_{i\in T} p_i = j} (-1)^{|T| - k} \binom{|T|-1}{k-1}\)。

我们试着把组合数阶乘拆开,但是似乎发现不了什么有用的东西。但是别忘了,组合数还有另一种拆法:
\[ \begin{align*}&\sum\limits_{\sum\limits_{i\in T} p_i = j} (-1)^{|T| - k} \binom{|T|-1}{k-1}\\= &\sum\limits_{\sum\limits_{i\in T} p_i = j} (-1)^{|T|-k}(\binom{|T|-2}{k-1}+\binom{|T|-2}{k-2})\\= &\sum\limits_{\sum\limits_{i\in T} p_i = j} -(-1)^{(|T|-1)-k}\binom{|T|-2}{k-1}+(-1)^{(|T|-1)-(k-1)}\binom{|T|-2}{k-2}\\\end{align*} \]
不妨令 \(dp[i][j][k]\) 表示前 \(i\) 个数,组成的背包总 \(p\) 值为 \(j\),在基准 \(k\) 为 \(k\) 的时候的总贡献。

于是上面的式子可以写成
\[ dp[i][j][k] = dp[i-1][j-p_i][k-1]-dp[i-1][j-p_i][k] \]
同时还需要加上不选的方案
\[ dp[i][j][k] = dp[i-1][j][k] + dp[i-1][j-p_i][k-1]-dp[i-1][j-p_i][k] \]
只需要求这个 \(dp\) 数组就可以了。


时间复杂度 \(O(nkm)\)。空间可能会开不下,可以使用滚动数组

#include<bits/stdc++.h>#define fec(i, x, y) (int i = head[x], y = g[i].to; i; i = g[i].ne, y = g[i].to)
#define dbg(...) fprintf(stderr, __VA_ARGS__)
#define File(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
#define fi first
#define se second
#define pb push_backtemplate<typename A, typename B> inline char smax(A &a, const B &b) {return a < b ? a = b, 1 : 0;}
template<typename A, typename B> inline char smin(A &a, const B &b) {return b < a ? a = b, 1 : 0;}typedef long long ll; typedef unsigned long long ull; typedef std::pair<int, int> pii;template<typename I> inline void read(I &x) {int f = 0, c;while (!isdigit(c = getchar())) c == '-' ? f = 1 : 0;x = c & 15;while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + (c & 15);f ? x = -x : 0;
}const int N = 1000 + 7;
const int M = 10000 + 7;
const int K = 11 + 7;
const int P = 998244353;int n, m, k;
int p[N], dp[M][K];inline int smod(int x) { return x >= P ? x - P : x; }
inline void sadd(int &x, const int &y) { x += y; x >= P ? x -= P : x; }
inline int fpow(int x, int y) {int ans = 1;for (; y; y >>= 1, x = (ll)x * x % P) if (y & 1) ans = (ll)ans * x % P;return ans;
}inline void work() {k = n - k + 1;dp[0][0] = 1;for (int i = 1; i <= n; ++i) {for (int j = m; j >= p[i]; --j)for (int k = ::k; k; --k) sadd(dp[j][k], smod(dp[j - p[i]][k - 1] + P - dp[j - p[i]][k]));}int ans = 0;for (int i = 1; i <= m; ++i) sadd(ans, (ll)dp[i][k] * m % P * fpow(i, P - 2) % P);printf("%d\n", ans);
}inline void init() {read(n), read(k), read(m);for (int i = 1; i <= n; ++i) read(p[i]);
}int main() {
#ifdef hzhkkfreopen("hkk.in", "r", stdin);
#endifinit();work();fclose(stdin), fclose(stdout);return 0;
}

转载于:https://www.cnblogs.com/hankeke/p/P4707.html

P4707 重返现世 扩展 MinMax 容斥+DP相关推荐

  1. Luogu P4707 重返现世 (拓展Min-Max容斥、DP)

    题目链接 https://www.luogu.org/problem/P4707 题解 最近被神仙题八连爆了-- 首先Min-Max容斥肯定都能想到,问题是这题要用一个扩展版的--Kth Min-Ma ...

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

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

  3. 【洛谷P4707】重返现世(Min-Max容斥)(背包)

    传送门 题解: 首先令k=n−k+1k=n-k+1k=n−k+1,转化为求第kkk大. 直接利用Kth−MinMaxKth-MinMaxKth−MinMax容斥的式子我们知道要求这个东西: E(kth ...

  4. 【洛谷P4707】重返现世【扩展Min-Max容斥】【dp】

    传送门 题意:NNN种物品,每次第iii种产生概率为piM\frac{p_i}{M}Mpi​​,∑pi=M\sum p_i=M∑pi​=M.求生成KKK种不同物品的期望时间 模998244353998 ...

  5. P5643-[PKUWC2018]随机游走【min-max容斥,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P5643 题目大意 给出nnn个点的一棵树,一个人从点xxx开始随机游走,然后QQQ次询问给出一个点集SSS,求期望 ...

  6. P4707-重返现世【dp,数学期望,扩展min-max容斥】

    正题 题目链接:https://www.luogu.com.cn/problem/P4707 题目大意 nnn个物品,每次生成一种物品,第iii个被生成的概率是pim\frac{p_i}{m}mpi​ ...

  7. 【题解】P4707 重返现世

    [题解]P4707 重返现世 P4707 重返现世 期望下Min-Max容斥DP E(kthmax(T))=∑T⊂S(−1)∣T∣−kC∣T∣−1k−1E(min⁡(S))E(kthmax(T)) = ...

  8. [洛谷P4707] 重返现世

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

  9. [luogu P4707] 重返现世

    Description 洛谷题目链接:https://www.luogu.org/problemnew/show/P4707 Solution 前置广义\(\min-\max\)容斥,不懂的可以看看我 ...

最新文章

  1. oracle dbms_output.put不输出
  2. 直播赠书丨如何高效学习计算机视觉?
  3. 使用OkHttp高效开发调试
  4. UGUI的优点新UI系统四 开源
  5. android+notepad教程,Android平台应用开发实例:Notepad
  6. 鲜为人知的C++ IO fstream流
  7. KubeSphere配置集(ConfigMap)的使用
  8. mongo java aggregate_java使用spring + mongo进行Aggregation聚合查询
  9. CentOS安装之后的系统安全配置
  10. keras系列︱Application中五款已训练模型、VGG16框架(Sequential式、Model式)解读(二)
  11. gis差值分析_GIS空间插值分析图解
  12. win7 iis安装教程
  13. 黑苹果El Captain 10.11.2 安装
  14. 如何解决Mac电脑键盘上的大写锁定键灯不亮?
  15. 网络视频和移动营销 一根绳子上的蚂蚱
  16. 网络分流器|网络分流器|网络分流采集器的应用领域
  17. 使用UltraISO软碟通制作Win10PE启动U盘
  18. 解决oracle11卸载,Oracle11完全卸载方法
  19. 联想笔记本 售后/驱动 下载地址
  20. 文件传服务器上全是乱码,解决txt文件上传oss服务器乱码的问题

热门文章

  1. 用Python 做成语接龙,超简单,有语音,过年和孩子玩
  2. 报错解决——RuntimeError: The size of tensor a (4) must match the size of tensor b (3) at non-singleton
  3. 2018年总结和职场规划
  4. 2019-07-17_The error may involve XXX(包)-Inline The error occurred while setting parameters
  5. 解决Navicat1166错误
  6. 推荐系统论文拾遗之1——行列式点过程(DPP)多样性控制
  7. proxifier 代理bluestack
  8. Android WebView截屏空白或者一片黑如何解决?使用MediaProjection截图。
  9. web前端开发需要学习什么?需要哪些开发工具?
  10. C# VBA 提取word中图片方法