卧薪尝胆,厚积薄发。
矩形覆盖
Date: Sat Mar 30 16:35:06 CST 2019
In Category:
NoCategory
Description:
给出
$n$
个必须覆盖的点的坐标
$(x[i],y[i])$
和
$m$
个不能覆盖的点的坐标
$(x'[i],y'[i])$
,每次可以选一个下边界紧贴
$x$
轴的矩形,要求把所有必盖点都覆盖并且不覆盖不能覆盖的点,对于
$n$
的
$2^n$
个子集输出最少需要的矩形数之和。
$1\leqslant n\leqslant 1000$
Solution:
首先我们求出
$mn[p]=\min y'[i](x[p]<x'[i]<x[p+1]$
,那么我们可以按照
$mn[p]$
建出一棵笛卡尔树,那么我们可以把树上一个点看成一个区间
$[l,r]$
,或者是一个宽为
$[l,r]$
,高为
$h[l,r]=\min mn[p]\ p\in[l,r)$
,如果
$l=r$
那么表示的就是
$(x[l],y[l])$
这个点,那么显然能覆盖一个点的矩形一定是从
$[i,i]$
开始往上的一条链,这个可以预处理出来每条链的最高点,然后我们的问题就变成了给树上一些从叶子开始的直上直下的链,选一些点使得每条链中都有点,我们就有了一个线性的贪心算法,
$f[i]$
表示在
$i$
这个点子树内还没有被覆盖的深度的最大值,如果
$f[i]=dep[i]$
,那么显然必须在
$i$
这里放一个,那么对于对所有子集求和的询问,我们可以使用
$DP$
套
$DP$
,也就是设
$f[i][j]$
表示在第
$i$
个点
$f[i]=j$
的状态的个数,然后每次加上
$f[i][dep[i]]$
即可。
Code:
没有代码
Copyright © 2020
wjh15101051
ღゝ◡╹)ノ♡