调换枚举顺序
Example 1 求
ans=l=1∑nr=l∑nl≤i≤rminai
求 max 类似。直接统计十分困难,考虑枚举 i,求符合条件的区间数量。
ans=i=1∑nl=1∑ir=i∑n[ai=l≤j≤rminaj]=i=1∑nl=1∑ir=i∑n[∀l≤j≤r,ai≥aj]
先假设 ai 互不相同,那么设 prei 为最大的 j 满足 j<i∧aj<ai,nxti 为最小的 j 满足 j>i∧aj<ai,那么 l,r 必须满足 prei<l∧r<nxti。
不难发现,符合条件的 [l,r] 数量即为 (i−prei)(nxti−i)。故
ans=i=1∑n(i−prei)(nxti−i)
pre,nxt 可用单调栈求,基本操作。
当 ai 中有相同元素时可能会算重或算漏,不妨钦定当且仅当 i 为 [l,r] 内第一个最小值时合法,那么需要稍微修改 prei 的定义,为最大的 j 满足 j<i∧aj≤ai,即 i 之前不能有相等的最小值。
Example 2 求
ans=l=1∑nr=l∑nf(l,r)
其中 f(l,r) 表示 S(l,r)={ai∣i∈[l,r]} 中的连续段个数。(Src:AT_abc390_f [ABC390F] Double Sum 3。)
注意到每个连续段必有结尾(或者开头,也是等价的),故使 [l,r] 内每个 ax 均代表一个连续段,其中 x 满足 x 最小且 ax∈S(l,r)∧ax+1∈/S(l,r)。
枚举 x,求有多少个区间 [l,r] 满足 S(l,r) 中有 ax 代表的连续段。同样定义 prei 为最大的 j 使得 j<i∧(aj=ai∨aj=ai+1),nxti 为最小的 j 使得 j>i∧aj=ai+1,答案与上一题形式相同。
Conclusion 本质是将枚举复杂度大的对象换成复杂度小的。比如区间有 O(n2) 个,而最小值只可能有 O(n) 个,显然枚举最小值更优。但同时也要考虑求合法对应对象的复杂度。最小值求合法区间数量均摊 O(1),可以接受。