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)\)
posted @ 2025-12-09 19:25  哼唧昂叽  阅读(4)  评论(0)    收藏  举报