前言
- 真的,做题就想钻空子一样,灵活,巧妙的躲避一切障碍,多有趣啊(记得在那堂课上真心为蜡老师鼓掌)
题目简述
- 给出一个数组 \(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)
评论()
收藏
举报