CF559E Gerald and Path

题意

nn 根线段,已知其中一个端点和长度,求最长覆盖

题解

等价于每根线段要么不选,要么取一段前缀,要求两两无交,求最长覆盖

按已知端点排序,fi,jf_{i,j} 表示前 ii 条线段,被覆盖的最靠右的点在 jjjj 左侧的最长覆盖
pip_i 是已知端点,lil_i 是向左的另一个端点,rir_i 是向右的另一个端点

  • ii 不选
    fi,jfi1,jf_{i,j}\leftarrow f_{i-1,j}
  • ii 向右
    如果 ii 左边的线段在 rir_i 右边有贡献,那么不如不选 ii
    也就是 ii 直接接在最后
    j[pi,ri],fi,jfi1,p+dist(pi,j)\forall j\in[p_i,r_i],f_{i,j}\leftarrow f_{i-1,p}+\text{dist}(p_i,j)
  • ii 向左
    如果线段 mmlil_i 左边有贡献,n(nm)n(n\le m)pip_i 右边有贡献,那么 ii 向右肯定不劣于向左
    于是可以枚举线段 k(k[1,i),pk>li)k\left(k\in[1,i),p_k>l_i\right)1k11\dots k-1lil_i 左边的贡献,ki1k\dots i-1 全部向右
    即令 R=max{pi,maxkj<irj}R=\max\{p_i,\max\limits_{k\le j<i}r_j\}j[li,R],fi,jfk1,li+dist(li,j)\forall j\in[l_i,R],f_{i,j}\leftarrow f_{k-1,l_i}+\text{dist}(l_i,j)
    这一块可以优化到单行 Θ(n)\Theta(n),详见代码

最后,根据定义,fi,jmin1kjfi,kf_{i,j}\leftarrow \min\limits_{1\le k\le j}f_{i,k}

总共 Θ(n2)\Theta(n^2)

codeforces submission 155923484

CF559E Gerald and Path

https://gzezfisher.top/cf559e/

作者

Fisher Cai

发布于

2022-05-06

更新于

2025-07-22

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×