当前位置: 首页 > news >正文

题解:P7213 [JOISC 2020] 最古の遺跡 3

需要一些观察的计数。

题意:有一个由 \(1,2,\cdots n\) 各出现两次构成的序列 \(a\),对其进行 \(n\) 次操作,如果一个元素满足后面的元素没有和他相等的,那么他就不变,否则该元素减 \(1\),减到 \(0\) 的元素移除。现在给出最后剩下的元素在原序列中的下标,求原序列有多少种。

做法:

首先先进行一个简单的转化,我们先给每种数内部定序,这样的好处是我们可以直接变成一个 \(2n\) 长序列而不用考虑一种数会不会放多次,最后计算的时候除以 \(2^n\) 即可。

从值域上考虑,发现根本没法描述位置的事情,所以考虑直接从位置上考虑。

考虑如果给定一个序列,最后剩下的下标如何确定。我们从后往前扫,假设当前高度为 \(h_i\),如果 \([x,h_i]\) 中的数都已经出现过,那么这个位置的高度就是 \(x-1\),当然 \(0\) 就不保留。称这些保留的位置为关键点。

那么我们可以根据这个东西去设计一个 dp,\(dp_{i,j}\) 代表后 \(i\) 个数,目前关键点构成的元素已经填满了 \([1,j]\)\(j+1\) 一定没有,剩余的有没有都可以。记当前后缀中出现了 \(cnt0\) 次非关键点,\(cnt1\) 次关键点。

考虑对于关键点和非关键点转移。

  • 非关键点。

那么要求一定是在 \([1,j]\) 内的,否则就会留下来。因为已经用掉了 \(cnt_0\) 次,同时 \([1,j]\) 各用了一次,所以系数为 \(j-cnt_0\)

\[dp_{i-1,j}\leftarrow dp_{i,j}(j-cnt_0) \]

  • 关键点。

第一种是我加了,但是没加到 \(j+1\) 这个位置,那这样就不会有新的连续段,貌似贡献不好统计。不好统计那么我们就留到后面在确定,所以转移式:

\[dp_{i-1,j}\leftarrow dp_{i,j} \]

第二种是我加到 \(j+1\) 这个位置,枚举一下转移到 \(k\),那么我需要在前面没确定的那些位置里随便选几个出来组成 \([j+2,k]\),方案数为 \(\binom{cnt1-j}{k-j-1}\)。然后考虑我这个数的选法,为 \([j+2,k]\) 加起来有 \(k-j-1\) 种,还有 \(2\) 种是选 \(j+1\),方案数 \(k-j+1\),最后还要乘上我形成长度为 \(k-j-1\) 的段的方案数,这里用 \(g_{k-j-1}\) 表示,等会儿我们会具体来解释 \(g\) 的求法。有转移式:

\[dp_{i-1,k}\leftarrow dp_{i,j}\binom{cnt1-j}{k-j-1}(k-j+1)g_{k-j-1} \]

最后考虑 \(g\) 怎么求,直接枚举上一个位置选的是哪里,然后类似上面这个计算方式,有转移式:

\[g_n=\sum_{i=1}^n \binom{n-1}{i-1}g_{i-1}g_{n-i} \]

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1205, mod = 1e9 + 7;
int n, use[maxn], g[maxn], C[maxn][maxn], dp[maxn][maxn];
signed main() {cin >> n;for (int x, i = 1; i <= n; i++)cin >> x, use[x] = 1;n <<= 1;C[0][0] = 1;for (int i = 1; i <= n; i++) {C[i][0] = 1;for (int j = 1; j <= i; j++)	C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;}g[0] = 1;for (int i = 1; i <= n; i++) {for (int j = 1; j <= i; j++)g[i] = (g[i] + g[j - 1] * C[i - 1][j - 1] % mod * g[i - j] % mod * (j + 1) % mod) % mod;}dp[n + 1][0] = 1;int cnt[2] = {0, 0};for (int i = n; i >= 1; i--) {if(use[i]) {cnt[1]++;for (int j = cnt[0]; j <= cnt[1] - 1; j++) {dp[i][j] = (dp[i][j] + dp[i + 1][j]) % mod;for (int k = j + 1; k <= cnt[1]; k++) dp[i][k] = (dp[i][k] + dp[i + 1][j] * (k - j + 1) % mod * C[cnt[1] - j - 1][k - j - 1] % mod * g[k - j - 1] % mod) % mod;}}else {cnt[0]++;for (int j = cnt[0]; j <= cnt[1]; j++)dp[i][j] = (dp[i][j] + dp[i + 1][j] * (j - cnt[0] + 1)) % mod;}//	for (int j = cnt[0]; j <= cnt[1]; j++)//		cout << i << " " << j << " " << dp[i][j] << endl;}for (int i = 1; i <= n / 2; i++)dp[1][n / 2] = dp[1][n / 2] * (mod + 1) / 2 % mod;cout << dp[1][n / 2] << endl;return 0;
}
http://www.jsqmd.com/news/27108/

相关文章:

  • 2025年正规的净化材料净化板厂家最新推荐权威榜
  • 2025年诚信的渔用钢丝绳索具厂家推荐及采购参考
  • 2025年比较好的钢质艺术楼梯用户口碑最好的厂家榜
  • 2025年正规的分子筛空分制氮机厂家推荐及选择指南
  • 2025年比较好的KTV瓷砖最新TOP品牌厂家排行
  • CSP缺省源用什么?看看这篇文章就知道了!
  • 【GitHub每日速递 251031】支持1110+语言、可语音克隆!这款电子书转有声书神器不容错过
  • 2025年热门的拉力机厂家推荐及选购参考榜
  • 白名单还能坚持多久
  • 2025 年 10 月传感器厂家最新推荐,技术实力与市场口碑深度解析磁致伸缩位移/防爆位移/防水位移/隔爆位移/线性位移传感器厂家推荐
  • 2025年专业的多圈电位器最新TOP厂家排名
  • 2025年有实力的三相电力设备最新TOP厂家排名
  • 强化学习资料
  • 2025年靠谱的1000级净化工程厂家最新推荐排行榜:实力源头加工公司
  • 2025年口碑好的烟气电加热器厂家推荐及采购参考
  • PHP 中的命名艺术 实用指南
  • 2025年热门的全自动高压隔膜压滤机厂家选购指南与推荐
  • 2025年有实力冲压机械手行业内知名厂家排行榜
  • 2025年知名的园林雕塑高评价厂家推荐榜
  • 2025年最好的破碎机高评价厂家推荐榜
  • 2025年知名的金属防锈漆推荐TOP生产厂家:实力源头加工公司
  • 2025 年耐火砖厂家最新推荐榜,技术实力与市场口碑深度解析,筛选行业优质品牌氧化铝空心球/抗渗碳/高温轻质莫来石/高温耐火砖公司推荐
  • 2025年靠谱的花纹输送带厂家实力及用户口碑排行榜
  • 2025年比较好的单轨吊配件厂家最新用户好评榜
  • 2025年热门的废水处理用户口碑最好的厂家榜
  • 2025年评价高的冷拔丝厂家推荐及采购指南
  • 2025年热门的液压机TOP实力厂家推荐榜
  • Ansys Maxwell 中PWL函数的应用
  • 2025 年振动筛厂家最新推荐榜,技术实力与市场口碑深度解析:甄选高适配性优质厂家实验振动筛/防爆振动筛/精细振动筛/分级振动筛粉末振动筛公司推荐
  • 2025 年麦克风厂家最新推荐榜,聚焦技术实力与市场口碑深度解析直播/户外演出/U 段无线/UHF 无线麦克风公司推荐