CF559E Gerald and Path

题意

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

题解

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

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

  • ii 不选
    fi,j←fi−1,jf_{i,j}\leftarrow f_{i-1,j}
  • ii 向右
    如果 ii 左边的线段在 rir_i 右边有贡献,那么不如不选 ii
    也就是 ii 直接接在最后
    即 ∀j∈[pi,ri],fi,j←fi−1,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 向左
    如果线段 mm 在 lil_i 左边有贡献,n(n≤m)n(n\le m) 在 pip_i 右边有贡献,那么 ii 向右肯定不劣于向左
    于是可以枚举线段 k(k∈[1,i),pk>li)k\left(k\in[1,i),p_k>l_i\right),1…k−11\dots k-1 算 lil_i 左边的贡献,k…i−1k\dots i-1 全部向右
    即令 R=max⁡{pi,max⁡k≤j<irj}R=\max\{p_i,\max\limits_{k\le j<i}r_j\},∀j∈[li,R],fi,j←fk−1,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,j←min⁡1≤k≤jfi,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

×