gym102394 I. Interesting Permutation

题意:

有一个长为n的未知排列,给定所有的前缀极差,问数组的构造方案数。

思路:

考虑放球,开始有0个球,最后有n个球,一种放球方案就对应一种排列。

首先有两个限制:第一个极差一定是0,第n个极差肯定是n-1

放第 \(i\) 个球前,若极差没变,则只能放到已存在的最小球和最大球之间,能放的位置数是 上一次的极差 + 1 - 上一次的球数

若极差变大,则要放到已存在的所有球的左/右边,答案乘2

极差变小是非法的

int sol() {
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> h[i];
    if(h[1] != 0 || h[n] != n-1) return 0;
    ll ans = 1;
    for(int i = 2; i <= n; i++) {
        if(h[i] < h[i-1]) return 0;
        else if(h[i] == h[i-1]) (ans *= h[i-1] + 2 - i) %= mod;
        else (ans *= 2) %= mod;
    }
    return ans;
}
posted @ 2022-04-02 14:32  Bellala  阅读(40)  评论(0)    收藏  举报