【题解】P4755 Beautiful Pair

麻了,这么多典题没做过……

思路

分治 / 笛卡尔树。

这一类和区间最值相关的区间端点对计数应该都可以用这种做法做。

由于求的是最大值,不妨从大到小考虑每个 ai 的贡献。

显然存在一个连续的区间 [li,ri],使得这个区间任意包含 i 的子区间最大值均为 ai.

所以与 ai 相关的贡献只有可能在这个区间中产生。

这道题中 li=maxj<i,ajaij+1,ri=minj>i,aj>aij1,注意要特判一下边界情况。

一个思路是枚举 [li,i],[i,ri] 中较短的一个区间,尝试将当中的每一个位置作为区间一侧的端点,然后在另一侧计数满足条件的端点个数。这个过程可以用数据结构维护。

这种做法本质上是分治,等价于从大到小考虑 ai 的贡献,不断将当前的分治区间划分成两部分。

考虑这个分治的逆过程,相当于不断将两个小的合并区间合并。

因为每次遍历较小的区间,所以本质上是启发式合并,故而复杂度不超过 O(nlogn).

这道题中可以转化成询问某个区间内小于等于某个数的值个数。考虑将询问差分一下,离线下来挂在相应的位置询问就行。

还有另外一种构造笛卡尔树的做法,本质上是相同的,只不过是考虑在笛卡尔树上进行中序遍历来访问区间而已。可能这种做法比离线好调一点。

这个做法实际上是利用笛卡尔树的性质(大根堆)来求 [li,ri],可能泛用性没有分治做法高。

两种做法的时间复杂度都是 O(nlog2n)

另一道可以用这个方法解决的题目是 CF1777F

代码

posted @   kymru  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
主题色彩