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;
}

浙公网安备 33010602011771号