Everlasting Pages

返回

Codeforces Round 1072 (Div.3) E题题解#

题意:#

定义精致数组-kk为任意相邻两数之差至少为kk的数组。

给定长度为nn的排列pp,对于每一个从11到n−1n - 1的kk,找出精致数组-kk的数量。

思路:#

题目要求: 寻找相邻差值至少为kk的数组个数。

这可以转化为:寻找差分数组中某一子段的最小值至少为kk的数组个数。

这仍然很麻烦。于是我们可以先统计出最小值为k,k∈[1,n−1]k,k\in [1, n - 1]的子段数,最后再做前缀和即可转换为最小值至少为kk的数组个数。

关于统计最小值为kk的子段数,我们可以对差分数组中的每一个数进行单独计算:

对于第ii个差值,我们可以利用两次单调栈统计出第ii个差值左侧最近的满足d[l]<=d[i]d[l]<=d[i]的ll和右侧最近的满足d[r]<d[i]d[r]<d[i]的rr,这样即可以求出对于当前的d[i]d[i],以d[i]d[i]为最小值的数组个数:(i−l+1−1)×(r−i+1−1)(i - l + 1 - 1) \times (r - i + 1 - 1),即:(i−l)×(r−i)(i - l) \times (r - i)。

这样即可不重不漏地统计出所有最小值为kk的子段数,最后再从11到nn做前缀和即可求出最小值至少为kk的数组个数。

代码:#

Codeforces Round 1072 (Div.3) E题题解
https://blog.everlasting.xin/blog/codeforces_round_1072_e/
Author Everlasting
Published at 2026年1月13日

评论前请阅读隐私政策,请勿在公开评论中填写敏感信息。

评论正在加载,若长时间未显示,请刷新页面重试。