PKU 数据结构与算法 2023 期末题
题目大意
我们称一个序列是崎岖的,表示它任意两个相邻位置加起来都不小于 k。输入一个长度为 n 的序列 a,求它的所有重排中,有多少个是崎岖的。两个重排 b,c 不同意味着存在一个 i 使得 b[i] ≠c[i]。答案对 998,244,353 取模。对于 100% 的数据,n ≤ 200,000
题解
把 \(a\) 数组按照 \(|a_i-\frac{k}{2}|\) 大小排序,如果值相同则 \(a_i\ge\frac{k}{2}\) 的在前。称 \(a_i\ge\frac{k}{2}\) 为高位,反之为低位。
那么在题目所述的重排后,每个低位旁边只能是在 \(a\) 中它前面的高位。
模拟这样的过程。初始有两个点,表示 \(a_0=a_{n+1}=+\inf\) 为重排后的序列两侧的墙壁。
然后枚举 \(i=1\to n\):
- 如果 \(a_i\ge k/2\),且当前有 \(t\) 个点,在中间 \(t-1\) 个缝隙中随便插入到一个,作为一个新点,\(t=t+1\);
- 如果 \(a_i<k/2\),且当前有 \(t\) 个点,在中间 \(t-1\) 个缝隙中随便插入到一个,并且合并两旁的点成为一个,\(t=t-1\);
- 计数就是每次 \(*(t-1)\)

浙公网安备 33010602011771号