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