传送门


前置知识

做这题前,您需要认识这个式子:

\[kthmax(S)=\sum_{\varnothing\neq T\subseteq S}{|T|-1\choose k-1} (-1)^{|T|-k} min(T)
\]

如果不会可以来这里


思路

题目要求第\(k\)小。为了方便,以下令\(k=n-k+1\),即变为求第\(k\)大。

很显然,这题是让我们求这个东西:

\[\sum_{T\neq\varnothing}{|T|-1\choose k-1} (-1)^{|T|-k} min(T)
\]

然而\(n \leq 1000\) 的数据很明显不能暴力枚举每一个\(T\)。为了优化复杂度,我们考虑一个类似于背包的\(DP\)。

设\(f_{x,j,k}\)表示前\(x\)个元素,满足\(\sum p=j\),以\(k\)为基准的\(\sum_T {|T|-1 \choose k-1} (-1)^{|T|-k}\)的大小。可能你会奇怪为什么要记录\(k\),先往后面看。

考虑转移。显然要根据\(T\)中是否有\(x\)这个元素进行分类讨论。

当\(T\)中没有\(x\),直接转移,\(f_{x,j,k}+=f_{x-1,j,k}\)。

当\(T\)中有\(x\)时,显然前两维由\(f_{x-1,j-v}(v=p_x)\)转移而来,有

\[\begin{align*}
f'_{x,j,k}&=\sum_{x\in T} {|T|-1 \choose k-1}(-1)^{|T|-k}\\
&=\sum_T {|T| \choose k-1} (-1)^{|T|-k+1}//把x丢掉,转为考虑x-1时的T,此时\sum_p = j-v\\
&=\sum_T [{|T|-1 \choose k-1}+{|T|-1 \choose k-2}](-1)^{|T|-k+1}\\
&=\sum_T {|T|-1 \choose k-1}(-1)^{|T|-k}(-1)+\sum_T {|T|-1 \choose (k-1)-1} (-1)^{|T|-(k-1)}\\
&=f_{x-1,j-v,k-1}-f_{x-1,j-v,k}
\end{align*}
\]

最终我们得到转移方程:

\[f_{x,j,k}=f_{x-1,j,k}+f_{x-1,j-v,k-1}-f_{x-1,j-v,k}
\]

边界条件为\(f_{x,0,0}=1\)。

发现这东西时空复杂度都是\(O(nm(n-k))\),似乎要炸空间,所以还需要把第一维滚掉。

最后统计答案时枚举\(\sum p\)然后随便搞搞就好啦。


代码

#include<bits/stdc++.h>
namespace my_std{
using namespace std;
#define pii pair<int,int>
#define fir first
#define sec second
#define MP make_pair
#define rep(i,x,y) for (int i=(x);i<=(y);i++)
#define drep(i,x,y) for (int i=(x);i>=(y);i--)
#define go(x) for (int i=head[x];i;i=edge[i].nxt)
#define sz 10010
#define mod 998244353
typedef long long ll;
template<typename T>
inline void read(T& t)
{
t=0;char f=0,ch=getchar();
double d=0.1;
while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();
while(ch<='9'&&ch>='0') t=t*10+ch-48,ch=getchar();
if(ch=='.')
{
ch=getchar();
while(ch<='9'&&ch>='0') t+=d*(ch^48),d*=0.1,ch=getchar();
}
t=(f?-t:t);
}
template<typename T,typename... Args>
inline void read(T& t,Args&... args){read(t); read(args...);}
void file()
{
#ifndef ONLINE_JUDGE
freopen("a.txt","r",stdin);
#endif
}
// inline ll mul(ll a,ll b){ll d=(ll)(a*(double)b/mod+0.5);ll ret=a*b-d*mod;if (ret<0) ret+=mod;return ret;}
}
using namespace my_std; ll ksm(ll x,int y)
{
ll ret=1;
for (;y;y>>=1,x=x*x%mod) if (y&1) ret=ret*x%mod;
return ret;
}
ll inv(ll x){return ksm(x,mod-2);} int n,m,K;
int p[sz];
ll dp[2][sz][15]; int main()
{
file();
read(n,K,m);K=n-K+1;
rep(i,1,n) read(p[i]);
int c=0,cc=1;
dp[0][0][0]=1;
rep(i,1,n)
{
swap(c,cc);
rep(j,0,m) rep(k,0,K) dp[c][j][k]=0;
dp[c][0][0]=1;
rep(j,1,p[i]-1) rep(k,1,K) dp[c][j][k]=dp[cc][j][k];
rep(j,p[i],m)
rep(k,1,K)
dp[c][j][k]=(dp[cc][j][k]+dp[cc][j-p[i]][k-1]-dp[cc][j-p[i]][k]+mod)%mod;
}
ll ans=0;
rep(i,1,m) ans=(ans+dp[c][i][K]*inv(i)%mod*m%mod)%mod;
cout<<ans;
return 0;
}

洛谷P4707 重返现世 [DP,min-max容斥]的更多相关文章

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

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

  2. 洛谷 P4707 - 重返现世(扩展 Min-Max 容斥+背包)

    题面传送门 首先看到这种求形如 \(E(\max(T))\) 的期望题,可以套路地想到 Min-Max 容斥 \(\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T| ...

  3. 洛谷 P4707 重返现世

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

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

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

  5. [洛谷P4707] 重返现世

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

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

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

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

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

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

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

  9. 【洛谷5644】[PKUWC2018] 猎人杀(容斥+生成函数+分治NTT)

    点此看题面 大致题意: 有\(n\)个人相互开枪,每个人有一个仇恨度\(a_i\),每个人死后会开枪再打死另一个还活着的人,且第一枪由你打响.设当前剩余人仇恨度总和为\(k\),则每个人被打中的概率为 ...

随机推荐

  1. asp.net网页注释

    asp.net页面上有一个asp控件,结果 使用<!-- -->注释不起作用,最后发现使用<%-- --%>注释可以.

  2. 执行sql,使用带参的写法

    db.ExecuteNonQuery("UPDATE QU_QUALITYREPORT SET RETOSTATUS=1 WHERE BATCHID=@0 AND  PROVINCEAREA ...

  3. [C++]PAT乙级1011. A+B和C (15/15)

    /* 1011. A+B和C (15) 给定区间[-2^31, 2^31]内的3个整数A.B和C,请判断A+B是否大于C. 输入格式: 输入第1行给出正整数T(<=10),是测试用例的个数.随后 ...

  4. Coursera Deep Learning 2 Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization - week1, Assignment(Regularization)

    声明:所有内容来自coursera,作为个人学习笔记记录在这里. Regularization Welcome to the second assignment of this week. Deep ...

  5. LAS(Listener、Attender、Speller)端到端构架

    基于注意力(Attention)机制的端到端系统,又被称为LAS端到端构架. [6] W. Chan, N. Jaitly, Q. Le, O. Vinyals. Listen, Attend and ...

  6. python 多线程小方法

    import time from multiprocessing import Process, Lock, JoinableQueue from multiprocessing import Sem ...

  7. js判断浏览器类型和版本

    原网址:http://www.cnblogs.com/rubylouvre/archive/2009/10/14/1583362.html 除了另无它法,肯定不使用navigator.userAgen ...

  8. script标签

    script 元素既可以包含脚本语句,也可以通过 src 属性指向外部脚本文件.默认情况下script标签的会阻止文档渲染,相关脚本会立即下载并执行. 属性 在HTML5中script主要有以下几个属 ...

  9. lambda、pair、智能指针及时间函数

    Lambda 表达式 auto f1 = [](int x, int y) { return x + y; };cout << f1(2, 3) << endl; int n ...

  10. jQuery动态改变input框的属性