题目名称大雾……
这道题目实际上是道结论题,证法多样,所以专门写篇文章。
题目要求维护一个序列
ai
,每次修改一个值,或者对于一个区间
[L,R]
询问
maxL≤i<j≤R|ai−aj|j−i
要求算法复杂度 O(nlgn) 。
先考虑一种简单的分治(骗分)写法。我们考虑将我们目前分治到的序列 a′i 中的 max{a′i} 和 min{a′i} 求出来,然后我们马上发现如果以这两个点为分界,整个序列可以被分成三段,并相应分治求解。容易发现,所有最优的区间 [i,j] 必然不会跨越这两个点,因为跨越的情况下我们可以将区间的端点用这两个点之一代替,这样的话分子会更大而分母会更小,也就是答案更优。
到这里,我们其实已经看出了这道题目的性质:实际上,最优的区间 [j,i] 必然需要满足 j−i=1 ……因为这里的分治必然将区间越分越小,最后也就只能分到只剩两个相邻元素了。以上是证法1。
然后我们来一种几何证法。我们考虑将 ai 表示在直角坐标系上,画出所有的 (i,ai)
这里是一个例子,我们连接某两个相邻的点,考虑到题目所问就是斜率,由此我们可以证明后面的某个点与这两个点连接后所得到的斜率一定没有这两个点直接连接的斜率大。比如上面的那个图,考虑到 a=b+c ,我们选取 b 和
接下来,我们考虑不等式的证法。我们设 i<j<k ,如果我们令 f[i,j]=|ai−aj|j−i ,我们证明 f[i,j]≥f[i,k] 或 f[j,k]≥f[i,k] 。先暂且去掉绝对值符号来考虑,根据两个不等式间的相似性,我们有第一个不等式等价于
(aj−ai)(k−i)≥(ak−ai)(j−i)
第二个等价于
(ak−aj)(k−i)≥(ak−ai)(k−j)
鉴于
|ai−aj|j−i
与
|aj−ak|k−j
之间的大小关系无法确定,所以上述两式间必有一式成立(只要两个式子左右对应除一下就行了),以上为证法3。
另外,我在尝试构造这一结论的反例数据时,由均值不等式发现只有两个相邻数间差距都相等时证法3中的等号才成立,其余情况必然是大于号,于是我们可以发现这个结果也可以由
21>32>43>⋯
证出。以上是证法4,思路上有点类似于中学生数学题(GDOI 2016D1T1)的数学做法。