P6406 [COCI2014-2015#2] Norma【题解】

· · 题解

\mathcal{Update}\ at\ 2023.10.12

Question

给出一个序列 A,定义 f(l,r)

f_{l,r}=(r-l+1)\times \max(l,r) \times \min(l,r)

其中 \max(a,b) 表示 A_a \sim A_b 的最大值,\min 同理。

\sum_{l=1}^n \sum_{r=l}^n f(l,r)

Solution

对于这种给一个序列求每个二元组的值,一般考虑分治。

那我们考虑当前要处理的区间为 [L,R]mid 为其中点,我们递归求解 [L,mid][mid + 1,R],现在我们只需要处理 l\in[L,mid],r\in(mid,R] 的二元组即可。

考虑枚举每一个 l,计算这个 l 对答案产生的贡献。

容易想到,这个贡献分为三类。

我们形式化这些情况,设 \min(l, mid) 对右边产生的最远的影响为 a\max(l,mid) 对右边产生的最远的影响为 b

然后因为好处理,我们考虑设 w1\min(a,b)w2\max(a,b),然后分情况考虑。

这个区间的最大值分明就是 \max(l,mid)\min(l,mid),所以这个区间对答案产生的贡献为:

\sum_{i=mid+1}^{w1} f(l,i)=\max(l,mid) \times \min(l,mid) \times \sum_{i=mid+1}^{w1} (i-l+1)

然后右边的求和符号明显是等差数列,我们使用小学知识把他拆掉最后化简,得到:

\sum_{i=mid+1}^{w1} f(l,i)=\max(l,mid) \times \min(l,mid) \times \frac{w_1+mid-2l+3}{2}

然后又分成两种情况。

  1. a<b

这种情况呢,可以使用最大值,但是最小值使用不了。

这里有个重点,在分治问题中,mid 是极其重要的

比如这里,我们考虑把答案拆成两部分,即为 [l,mid](mid,w2] 去求解。

答案即为:

\sum_{r=w_1+1}^{w_2} f(l,i)=(\sum_{w1+1}^{w2}(mid-l+1)\times \min(mid+1,i) \times \max(l,mid)) + (\sum_{w1+1}^{w2}(i-(mid+1)-1) \times \min(mid+1,w2) \times max(l,mid))

看起来很长,但是很简单,第一个大括号是求 [l,mid] 的贡献,因为右边的最小值才是整个区间的最小值,所以乘的是右区间的最小值和左区间的最大值。

最后通过乘法分配律把两个区间拼在一起得到答案。

我们对这个式子进行化简。

\sum_{r=w1+1}^{w2} f(l,i)=(mid-l+1) \times \max(l,mid) \times \sum_{i=w1+1}^{w2} \min(mid+1,i)+\max(l,mid) \times \sum_{w1+1}^{w2}(i-mid) \times \min(mid+1,i)

然后对里面的求和符号我们可以使用前缀和拆开。

我们令 S1_{i,0} 表示前面那一段的前缀和,S1_{i,1} 表示后面的那段的前缀和,即

\begin{aligned} S1_{i,0} &= \sum_{j=mid+1}^i \min(mid+1,j)\\ S2_{i,0} &= \sum_{j=mid+1}^i \min(mid_1,j) \times (j-mid) \end{aligned}

然后这一段的贡献可以化简为:

\sum_{r=w1+1}^{w2} f(l,i)=\max(l,mid)\times ((mid-l+1)\times (S1_{w2,0} - S1_{w1,0})+(S1_{w2,1} - S1_{w1,1}))
  1. a>b

同理的,可以推出贡献为:

\sum_{r=w1+1}^{w2} f(l,i)=\min(l,mid)\times ((mid-l+1)\times (S2_{w2,0} - S2_{w1,0})+(S2_{w2,1} - S2_{w1,1}))

这段区间完全和上面的处理方法一样,只是前缀和的数组需要变一下,我觉得读者们应该都懂吧。

\sum_{r=w2+1}^{R} f(l,i)=(S3_{R,1}-S3_{w2,1}) + ((mid-l+1)+(S3_{R,0}-S3_{w2,0}))

至此,我们的全部情况都讨论清楚了,接下来有几个问题放在后面说一下。

做以上操作是 \mathcal{O}(n) 的,至于求 w1,w2 使用双指针就可以了

所以应用主定理应该可以知道复杂度为 \mathcal{O}(n\log n) 的,相当优秀。

辰星凌老师在他的题解上说是因为前缀最大值或最小值有单调性,但是我认为,这就是普通的前缀和啊?不是很懂,如果错了能不能踢踢我,我也想知道

感谢大佬帮我解决了这个问题,这里给出解答:

双指针 的前提是有单调性,所以需要前缀最大值或最小值有单调性才可以双指针

最后是代码了,但是我觉得这道题应该不是很难调,所以我就不放了QWQ

错了踢踢我

完结撒花✿✿ヽ(°▽°)ノ✿