题意
n
根线段,已知其中一个端点和长度,求最长覆盖
题解
等价于每根线段要么不选,要么取一段前缀,要求两两无交,求最长覆盖
按已知端点排序,fi,j
表示前
i
条线段,被覆盖的最靠右的点在
j
或
j
左侧的最长覆盖
pi
是已知端点,li
是向左的另一个端点,ri
是向右的另一个端点
- i
不选
fi,j←fi−1,j
- i
向右
如果
i
左边的线段在
ri
右边有贡献,那么不如不选
i
也就是
i
直接接在最后
即
∀j∈[pi,ri],fi,j←fi−1,p+dist(pi,j)
- i
向左
如果线段
m
在
li
左边有贡献,n(n≤m)
在
pi
右边有贡献,那么
i
向右肯定不劣于向左
于是可以枚举线段
k(k∈[1,i),pk>li),1…k−1
算
li
左边的贡献,k…i−1
全部向右
即令
R=max{pi,k≤j<imaxrj},∀j∈[li,R],fi,j←fk−1,li+dist(li,j)
这一块可以优化到单行
Θ(n),详见代码
最后,根据定义,fi,j←1≤k≤jminfi,k
总共
Θ(n2)
codeforces
submission 155923484