题解 - P15355 「LCOI R2 T1」Stochastic Dream
P15355 「LCOI R2 T1」Stochastic Dream
题目背景
2026 / 2 / 16 - 增强了输入输出样例。
题目描述
小杉有 \(n\) 本不同的书,第 \(i\) 本书高度为 \(a_i\),请你求出这些书有多少种不同的排列方式使得恰好有 \(k\) 本书的高度严格大于其右面所有书的高度。
我们规定,最后一本书一定满足条件。
答案对 \(998244353\) 取模。
输入格式
本题多测。
第一行一个整数 \(T\),表示数据组数。
对于每组数据:
第一行两个正整数 \(n\) 和 \(k\)。
第二行 \(n\) 个正整数,第 \(i\) 个整数表示第 \(i\) 本书的高度 \(a_i\)。
输出格式
对于每组数据,输出一行一个数,表示你的答案。
多测要换行!
输入输出样例 #1
输入 #1
1
3 1
1 2 3
输出 #1
2
输入输出样例 #2
输入 #2
6
1 1
42
7 1
13 2 8 21 34 55 89
8 3
1000000000 7 20 3 15 9 1 999999937
10 3
5 5 5 2 2 9 9 1 1 1
18 4
4 4 4 4 7 7 1 1 1 10 10 10 3 3 8 2 2 2
20 6
1 1 1 1 1 1 2 2 2 2 2 3 3 3 3 4 4 4 100 100
输出 #2
1
720
13132
1026432
25952575
0
说明/提示
对于所有数据,\(1\le T \le 10,1\le a_i \le 10^9\)。
| 测试点 | 数据范围 | 特殊性质 |
|---|---|---|
| \(1\) | \(1\le k\le n\le 10\) | 无 |
| \(2\) | ^ | ^ |
| \(3 \sim 5\) | \(1\le k\le n\le 2000\) | 有 |
| \(6 \sim 10\) | ^ | 无 |
| \(11 \sim 13\) | \(1\le k\le n\le 8000\) | 有 |
| \(14 \sim 20\) | ^ | 无 |
特殊性质:所有 \(a_i\) 互不相同。
Bonus: 思考一下本题时限为 \(100\) 毫秒时的做法。
赛时
想到或许可DP但是推不出式子,而且书本相同高度的情况不知道怎么上组合数。
思路
首先为了保证问题的无后效性,我们对所有书降序排序。这样高的书确定完了之后,之后低的书无论怎么插都不会影响当前已经确定合法的书了。然而此时我们发现,我们还需要考虑怎么维护高度相等的书,这个地方尤其需要注意,一个不小心就可能算错组合数或者列出一个非常难算的式子。也就是说直接离散化然后扔cnt里就行了。
定义DP状态 \(dp[i][j]\) 表示当前考虑了 \(i\) 种书,总共 \(j\) 本书符合要求(高度严格大于其右面所有书的高度)。
然后我们从大到小枚举每个cnt,对于其中cnt[i]的转移:
如果我们当前的书选择一本都不合法,那么就是全部塞最左边。
选择一本合法的话,那么就是排列一本塞最右边。
选择两本合法的话,那么就是排列两本塞最右边。
不能有两本合法!最多只有一本会做出贡献!
以此类推,选择 \(cnt[i]\) 本合法的话,那么就是排列 \(cnt[i]\) 本塞最右边
好的成功荒废一堆式子
重推一下:
如果当前贡献了 \(0\) 本的话,那直接 \(cnt[i]\) 本书插板法(插板可以相邻)插到 \(pre[i-1]\) 本书里,然后约束是右端点不能插。
如果当前贡献了 \(1\) 本的话,那么一定是先选一本放到最右侧,再排剩下 \(cnt[i]-1\) 本,随便插在 \(pre[i-1]\) 个元素里,也就是说总共是 \(pre[i-1]+1\) 块板,同样,插板可以相邻。
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MOD = 1e9 + 7; // 998244353;
const int INF = 2e9; // const ll INF = 4e18
const int N = 2e5 + 5;
int n, a[N];
void solve() {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t; cin >> t;
while (t--) solve();
return 0;
}

浙公网安备 33010602011771号