「codeforces - 1608F」MEX counting
首先考虑暴力,枚举规划前缀 \([1, i]\) 和前缀 mex \(x\),则我们需要 \(x\) 个数来填了 \([0, x)\),还剩下 \(i-x\) 个数随便填 \([0, x) \cup (x, n]\),如果直接组合数算可能会出问题,考虑 dp。
定义 \(f[i][x][j]\) 表示规划前缀 \([1, i]\),当前的 mex 为 \(x\),还有 \(j\) 个数当前不对 mex 的取值造成影响(也就是说他们都大于 \(x\),这 \(j\) 个数是指在 \(a\) 数组中的,所以我们不必关心这 \(j\) 个数具体是什么)。转移就分两种情况:
- \(a[i+1] \neq x\):\((i+1, x, j) \gets (i+1, x, j)+(i, x, j)*(x+j)\) 和 \((i+1, x, j+1) \gets (i, x, j)\),第一个就是考虑当加入的 \(a[i+1]\) 属于那 \(j\) 个数或者属于 \([0, x)\),第二个很简单;
- \(a[i+1] = x\):设当前 mex 变成了 \(y\),则有 \((i+1, y, j-y+x+1) \gets (i+1, y, j-y+x+1)+(i, x, j) \times \binom{j}{y-x-1} \times (y-x-1)!\),意义明显,注意后面那个是排列数而不是组合数。
然后这个是 \(O(n^2k^2)\) 的,把刷表改成填表后前缀和优化即可。
using modint = modint998244353;
int n, K, a[2100];
modint dp[2][2100][2100], sum[2][2100][2100], fct[2100], ifct[2100];
inline int L(int i) { return max(0, a[i]-K); }
inline int R(int i) { return min(i, a[i]+K); }
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
fct[0] = 1;
for (int i=1; i<2100; ++i) {
fct[i] = fct[i-1]*i;
}
ifct[2099] = fct[2099].inv();
for (int i=2098; i>=0; --i) {
ifct[i] = ifct[i+1]*(i+1);
}
cin >> n >> K;
for (int i=1; i<=n; ++i) {
cin >> a[i];
}
dp[0][0][0] = sum[0][0][0] = 1;
for (int i=1,cur=1; i<=n; ++i,cur^=1) {
for (int j=0; j<=i; ++j) {
for (int x=L(i); x<=R(i) && x<=j; ++x) {
dp[cur][x][j] = dp[cur^1][x][j]*j;
if (j) {
dp[cur][x][j] += dp[cur^1][x][j-1];
}
if (j && x) {
dp[cur][x][j] += sum[cur^1][min(x-1, R(i-1))][j-1]*ifct[j-x];
}
sum[cur][x][j] = dp[cur][x][j]*fct[j-x];
if (x) {
sum[cur][x][j] += sum[cur][x-1][j];
}
}
}
for (int j=0; j<=i-1; ++j) {
for (int x=L(i-1); x<=R(i-1) && x<=j; ++x) {
dp[cur^1][x][j] = sum[cur^1][x][j] = 0;
}
}
}
modint ans = 0;
for (int i=0; i<=n; ++i) {
for (int j=L(n); j<=R(n) && j<=i; ++j) {
ans += dp[n&1][j][i]*fct[n-j]*ifct[n-i];
}
}
cout << ans.val() << "\n";
}
「codeforces - 1608F」MEX counting的更多相关文章
- 「CodeForces 581D」Three Logos
BUPT 2017 Summer Training (for 16) #3A 题意 给你三个矩形,需要不重叠不留空地组成一个正方形.不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形 ...
- 「CodeForces - 50C 」Happy Farm 5 (几何)
BUPT 2017 summer training (16) #2B 题意 有一些二维直角坐标系上的整数坐标的点,找出严格包含这些点的只能八个方向走出来步数最少的路径,输出最少步数. 题解 这题要求严 ...
- 「CodeForces - 598B」Queries on a String
BUPT 2017 summer training (for 16) #1I 题意 字符串s(1 ≤ |s| ≤ 10 000),有m(1 ≤ m ≤ 300)次操作,每次给l,r,k,代表将r位置插 ...
- 「CodeForces - 717E」Paint it really, really dark gray (dfs)
BUPT 2017 summer training (for 16) #1H 题意 每个节点是黑色or白色,经过一个节点就会改变它的颜色,一开始在1节点.求一条路径使得所有点变成黑色. 题解 dfs时 ...
- 「CodeForces 476A」Dreamoon and Stairs
Dreamoon and Stairs 题意翻译 题面 DM小朋友想要上一个有 \(n\) 级台阶的楼梯.他每一步可以上 \(1\) 或 \(2\) 级台阶.假设他走上这个台阶一共用了 \(x\) 步 ...
- 「CodeForces 546B」Soldier and Badges 解题报告
CF546B Soldier and Badges 题意翻译 给 n 个数,每次操作可以将一个数 +1,要使这 n 个数都不相同, 求最少要加多少? \(1 \le n \le 3000\) 感谢@凉 ...
- 「Codeforces 79D」Password
Description 有一个 01 序列 \(a_1,a_2,\cdots,a_n\),初始时全为 \(0\). 给定 \(m\) 个长度,分别为 \(l_1\sim l_m\). 每次可以选择一个 ...
- 「Codeforces 468C」Hack it!
Description 定义 \(f(x)\) 表示 \(x\) 的各个数位之和.现在要求 \(\sum_{i=l}^rf(i)\bmod a\). 显然 ans=solve(l,r)%a; if(a ...
- 「Codeforces 724F」Uniformly Branched Trees
题目大意 如果两棵树可以通过重标号后变为完全相同,那么它们就是同构的. 将中间节点定义为度数大于 \(1\) 的节点.计算由 \(n\) 个节点,其中所有的中间节点度数都为 \(d\) 的互不同构的树 ...
- 「codeforces - 1284G」Seollal
给定 \(n\times m\) 的网格图,有些格子有障碍,无障碍且相邻的格子之间连边形成图.保证 \((1, 1)\) 无障碍,保证无障碍格子连通. 将网格图黑白染色,相邻格子颜色不同,\((1, ...
随机推荐
- 用 Python 帮运营妹纸快速搞定 Excel 文档
Microsoft Office 被广泛用于商务和运营分析中, 其中 Excel 尤其受欢迎.Excel 可以用于存储表格数据.创建报告.图形趋势等.在深入研究用 Python 处理 Excel 文档 ...
- 【Clickhouse】ReplaceingMergeTree引擎final实现合并去重探索
前言 在OLAP实践中,在有数据更新的场景中,比如存储订单数据,我们经常会用到ReplaceingMergeTree引擎来去重数据,以获取数据的最新状态.但是ReplaceingMergeTree引擎 ...
- 洛谷 P7579 「RdOI R2」称重(weigh) 题解
题意: 题目 一道交互题. 有 n 个球,里面有两个假球,假球比普通球的要轻,每次可以询问任意两组球的轻重关系,第一组轻为 < ,第二组轻为 > ,一样重量为 = . 思路: 先考虑在一个 ...
- Redis系列15:使用Stream实现消息队列(精讲)
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...
- js递归生成树形结构
先看结果 结果 [ { "id": 1, "title": "张三", "parent_id": -1, "c ...
- CKS 考试题整理 (12)-Trivy扫描镜像安全漏洞
Task 使用Trivy开源容器扫描器检测namespace kamino中 Pod 使用的具有严重漏洞的镜像. 查找具有High或Critical严重性漏洞的镜像,并删除使用这些镜像的Pod. 注意 ...
- PHP文件包含总结
1.文件包含小知识 1.1 包含函数 PHP共有4个与文件包含相关的函数: include require include_once require_once include与include_once ...
- pytest7.4版本的一个变更,可能会影响你的项目
pytest7.4版本的一个变更,可能会影响你的项目 本文撰写于 2023.7.10 准备工作 项目结构如下 D:\Gitee\DemoRepo (17.97MB) +-- testCases (1. ...
- 【Docker】迷你使用手册
一.安装与配置 安装: # Centos7 yum install docker 启动 & 设为开机启动: systemctl start docker.service systemctl e ...
- 【阅读笔记】低照度图像增强-《Adaptive and integrated neighborhood-dependent approach for nonlinear enhancement of
本文介绍改进INDANE算法的低照度图像增强改进算法(AINDANE算法),<Adaptive and integrated neighborhood-dependent approach fo ...