[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 |
|