题解 - 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;
}
posted @ 2026-08-31 14:30  peter_code  阅读(7)  评论(0)    收藏  举报