宇宙飞船

博客探讨了如何将一个序列转换为满足特定条件的“好”序列,即序列中的每个元素要么是后缀最小值,要么是后缀最大值。通过连接最长递增子序列(LIS)和最长递减子序列(LDS),可以在O(nlogn)的时间复杂度内完成序列的优化。文章提到了一种接近最优解的策略,并分享了相关思路和解决方案。
摘要由CSDN通过智能技术生成

题目

传送门 to usOJ

题意概要
对于任意序列,令 x 0 = 0 x_0=0 x0=0

对于一个无相同元素的序列,称其为 “好的” ,当且仅当如下条件成立:对于任意不大于 n n n 的自然数 j , k j,k j,k ,区间 [ x j − 1 , x j ] [x_{j-1},x_{j}] [xj1,xj] [ x k − 1 , x k ] [x_{k-1},x_{k}] [xk1,xk] 要么包含,要么不相交。也就是说, x j − 1 < x k − 1 < x j < x k x_{j-1}<x_{k-1}<x_j<x_k xj1<xk1<xj<xk 是不可以原谅的!

现在有一个长度为 n n n 的排列 ⟨ x 1 , x 2 , x 3 , … , x n ⟩ \langle x_1,x_2,x_3,\dots,x_n\rangle x1,x2,x3,,xn 。现在你可以改变一些 x x x 的值,使它变成 “好的” 。当然,这里的 x 0 = 0 x_0=0 x0=0 是规定的,不可以改。

注意, x x x 可以修改为任意实数。输出最小的更改数量。

思路

几乎就是正解了,只差了一点点 😢

首先注意到:如果 ⟨ x ⟩ \langle x\rangle x 是 “好的” ,当且仅当每个元素 要么是后缀最小值,要么是后缀最大值

那么你就猜到了,更改 x x x 的最佳方式就是使其无限接近于上一个 x x x等价于从序列中删去

什么样的子序列满足上面的条件呢?其实真理的大海就在面前。就是 以某个点作为结尾的 L I S \tt LIS LIS L D S \tt LDS LDS 拼接在一起

然后就做完了。复杂度 O ( n log ⁡ n ) \mathcal O(n\log n) O(nlogn) ,又好写。

代码

今天又被 s y \tt sy sy 虐了,烦,不想写代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值