CF2077D Maximum Polygon

前言

  • 真的,做题就想钻空子一样,灵活,巧妙的躲避一切障碍,多有趣啊(记得在那堂课上真心为蜡老师鼓掌)

CF2077D Maximum Polygon

题目简述

  • 给出一个数组 \(a_i\) 选出一个字典序最大的长度大于等于 \(3\) 的子序列 \(s_i\)
  • 满足 \(2\cdot \max(s_1,s_2,\cdots,s_n)< s_1+s_2+\cdots+s_n\)

题解

  • 注意考虑简单的问题,缩小一些范围
  • 考虑 \(ma<mi+semi\) 考对原序列排序,只要存在一个上式,字典序最大的开头就可以是 mi 了。
  • 考虑 若是,不满足则有,\(ma>mi+semi\) 什么意思,排完需后,呈斐波那契数列的速度递增,相当于 \(\log V\)
  • 也就是说剩下 \(\log V\)\(s\) 的开头需要枚举
  • 之后我们枚举最大值,(其实自己试试就知道,不枚举最大值的话,其他方法都不太好算出方案啊)
  • 有了最大值,尝试 \(O(n)\) 构造出在这个最大值的情况下最优的序列
  • 我们考虑维护一个栈取算 \(s\)
  • 我们有的时候可以用 \(s_x>s_{x+1}\),x+1 的地方替代 x 之所以不替代,是为了维护字典序列最大
  • 这样的话我们至少有 \(s_{x}<s_{x+1}\) 的话,\(x+1\) 之前的位置都会被确定,唯一剩下的是一个下降的后缀
  • 而下降的后缀可以直接用栈依次替换,不会出现跳段贡献更优的情况。
  • 于是 \(O(n\log m)\) 啦!
posted @ 2025-04-23 10:41  LUHCUH  阅读(68)  评论(0)    收藏  举报