[HNOI2018]转盘[结论+线段树]

题意

题目链接

分析

  • 首先要发现一个结论:最优决策一定存在一种 先在出发点停留之后走一圈 的情况,可以考虑如下证明:
  1. 如果要停留的话一定在出发点停留,这样后面的位置更容易取到。

  2. 走超过两圈的情况都可以变成走一圈+再走一段,首先若干圈显然只有最后一圈是有意义的。

    但是可能在取到最后一个位置之前我们会把起点之前的一段后缀通过走一圈的方式取完,所以会再走一段。

  3. 进一步推理,发现情况2中,如果我们选择那段后缀的开头作为我们的起点,结果不会变差。容易归纳得到最终的答案一定只会走一圈。

  • 将序列倍长,记 \(a_i=T_i-i\) 不难得到 \(ans=\min\limits_{i=1}^n\{\max\limits_{j=i}^{i+n-1}a_{i+j-1}+i\}+n-1\)

  • 实际可以放宽约束,上式与下式等价:\(ans=\min\limits_{i=1}^n\{\max\limits_{j=i}^{2n}a_{i+j-1}+i\}+n-1\)

  • 我们要求的即 \(\min\limits_{i=1}^nsuf_i+i\),可以考虑像 楼房重建 一题一样线段树维护单调栈。具体操作的难点在于合并。

  • 因为维护后缀极值所以右区间的答案可以直接贡献。记录区间最大值 \(mx\) 和 在区间的右子区间影响左子区间之后,左子区间的答案 \(lf\)。考虑左边被右边最大的位置遮挡的问题。可以花 \(log\) 的时间找到左区间第一个 \(\ge mx_R\) 的位置 \(pos\) ,首先新产生了一个可能答案 \(pos+1+mx_R\) ,然后左区间的答案可以再花 \(log\) 的时间递归寻找答案。

  • 总时间复杂度 \(O(nlog^2n)\)

代码链接

posted @ 2019-01-14 10:48  fwat  阅读(162)  评论(0编辑  收藏  举报