[BZOJ1852] [MexicoOI06]最长不下降序列(贪心)
[BZOJ1852] [MexicoOI06]最长不下降序列(贪心)
考虑如下贪心
(我将问题反过来考虑,也就是要满足)
首先对于读入的,按照的值递增排序
(选出的答案序列不一定是其中一个有序的子序列)
答案序列存在若干个递增的位置,设它们是
合法的递增序列需要满足的限制是
考虑剩下的部分即,那么这些点放在后面一定是最优的(因为此时不会改变最大的),此时限制它们的就是
即这一部分中满足的均可以选出来
为了便于表示,设,可以通过一个主席树维护
定义表示当前以为最大的的答案,特别的,表示序列为空
枚举每个进行转移
朴素的转移就是可以枚举上一个位置,转移
需要找到前面第一个能把接上去的即可,即第一个的位置,那么合法的决策位置就是
则
设最优决策点为,影响最优决策点位置的有两个方面
从这一段点考虑,越小时,就会有越多的点对被限制,也就是说越大,对于中间这一段来说越优
但是从的角度考虑,并不是越大越好,因为可能存在一个特别小限制了前面递增点列的选择
推论:如果前面存在一个,那么
事实上应该说成
综合上面两条来看,如果意味着把它放进递增序列里绝对是优的,因为不会对前面的点产生不良限制
消除了不良限制之后,就满足最优性了
所以发现最优决策点的范围缩小到了
发现决策范围内的
所以
所以可以直接维护一个前缀最大值,每次二分找到那个,求出即可
1 | const int N=2e5+10,K=15; |
附:离线做法
1 |
|