Everlasting Pages

返回

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

题意:#

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

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

思路:#

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

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

这仍然很麻烦。于是我们可以先统计出最小值为k,k[1,n1]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]为最小值的数组个数:(il+11)×(ri+11)(i - l + 1 - 1) \times (r - i + 1 - 1),即:(il)×(ri)(i - l) \times (r - i)

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

代码:#

Codeforces Round 1072 (Div.3) E题题解
https://blog.everlasting.xin/blog/codeforces_round_1072_e/
Author Everlasting
Published at 2026年1月13日
Comment seems to stuck. Try to refresh?✨