将所有线段的端点(即$a_{i}$和$a_{i}\pm l_{i}$)离散,并按照$a_{i}$从小到大排序

定义$f_{i,,j}$表示前$i$条线段在位置$j$之前最多能覆盖的长度(默认覆盖到$j$,允许覆盖到$j$之后,但该部分不计入覆盖的长度),转移对第$i$条线段的方向分类讨论:

(关于"默认覆盖到$j$",完整的描述即默认$[a_{i},j]$已经被覆盖,即之后覆盖不计算贡献)

1.若第$i$条线段向右覆盖,即有
$$
f_{i,j}=\begin{cases}f_{i-1,j}&(j\le a_{i}或a_{i}+l_{i}<j)\\f_{i-1,a_{i}}+(j-a_{i})&(a_{i}<j\le a_{i}+l_{i})\end{cases}
$$
2.若第$i$​条线段向左覆盖,即有
$$
f_{i,j}=\begin{cases}f_{i-1,j}&(j\le a_{i}-l_{i})\\f_{i-1,a_{i}-l_{i}}+(j-(a_{i}-l_{i}))&(a_{i}-l_{i}<j\le a_{i})\\\max_{1\le k\le i}\left(f_{k-1,a_{i}-l_{i}}+\min(a_{k}+l_{k},j)-(a_{i}-l_{i})\right) &(a_{i}<j)\end{cases}
$$
这里解释一下第3种情况,考虑枚举最终右端点的位置(如果选$k=i$即不存在,注意此时中间应为$a_{k}$),那么注意到在其之后的直线如果向前覆盖到$a_{i}-l_{i}$之前,即已将整个$[a_{i}-l_{i},a_{i}]$全部覆盖,那么显然一定不如向右覆盖,因此即只需要考虑其之前的线段即可

综上,时间复杂度为$o(n^{3})$,可以通过

事实上,还可以进行优化,复杂度的瓶颈在于向左覆盖时$a_{i}<j$的部分,显然该部分可以用线段树优化(只需要对$a_{k}+l_{k}$和$j$的大小关系分类讨论即可),时间复杂度即降为$o(n^{2}\log n)$

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 105
4 map<int,int>mat;
5 map<int,int>::iterator it;
6 int n,m,a[N],l[N],pos[N*3],id[N],posl[N],posm[N],posr[N],f[N][N*3];
7 bool cmp(int x,int y){
8 return a[x]<a[y];
9 }
10 int main(){
11 scanf("%d",&n);
12 for(int i=1;i<=n;i++){
13 scanf("%d%d",&a[i],&l[i]);
14 mat[a[i]]=mat[a[i]-l[i]]=mat[a[i]+l[i]]=1;
15 }
16 for(it=mat.begin();it!=mat.end();it++){
17 mat[(*it).first]=++m;
18 pos[m]=(*it).first;
19 }
20 for(int i=1;i<=n;i++)id[i]=i;
21 sort(id+1,id+n+1,cmp);
22 for(int i=1;i<=n;i++){
23 int x=id[i];
24 posl[i]=mat[a[x]-l[x]];
25 posm[i]=mat[a[x]];
26 posr[i]=mat[a[x]+l[x]];
27 }
28 for(int i=1;i<=n;i++)
29 for(int j=1;j<=m;j++){
30 int x=id[i];
31 f[i][j]=f[i-1][j];
32 if (a[x]<pos[j])f[i][j]=max(f[i][j],f[i-1][posm[i]]+min(pos[j]-a[x],l[x]));
33 if ((a[x]-l[x]<pos[j])&&(pos[j]<=a[x]))f[i][j]=max(f[i][j],f[i-1][posl[i]]+(pos[j]-(a[x]-l[x])));
34 if (a[x]<pos[j]){
35 f[i][j]=max(f[i][j],f[i-1][posl[i]]+l[x]);
36 for(int k=1;k<i;k++)f[i][j]=max(f[i][j],f[k-1][posl[i]]+min(a[id[k]]+l[id[k]],pos[j])-(a[x]-l[x]));
37 }
38 }
39 printf("%d\n",f[n][m]);
40 return 0;
41 }

[cf559E]Gerald and Path的更多相关文章

  1. 「CF559E」 Gerald and Path

    「CF559E」 Gerald and Path 为啥我现在做啥题都在想网络流啊 考虑 \(\texttt{DP}\). 容易想到状态应该包含当前枚举了前 \(i\) 条线段,且第 \(i\) 条线段 ...

  2. Codeforces 559E - Gerald and Path(dp)

    题面传送门 真·难度 *3000 的 D1E hb 跟我们说"做不出来不太应该". 首先我们将所有线段按 \(a_i\) 从小到大排序,一个很显然的想法是 \(dp_{i,j,d} ...

  3. NodeJs之Path

    Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...

  4. 【原】实时渲染中常用的几种Rendering Path

    [原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 —— polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...

  5. Node.js:path、url、querystring模块

    Path模块 该模块提供了对文件或目录路径处理的方法,使用require('path')引用. 1.获取文件路径最后部分basename 使用basename(path[,ext])方法来获取路径的最 ...

  6. VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%

    1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...

  7. Leetcode 笔记 113 - Path Sum II

    题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...

  8. Leetcode 笔记 112 - Path Sum

    题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...

  9. Thinking in Unity3D:渲染管线中的Rendering Path

      关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的 ...

随机推荐

  1. 原生JS实现简单留言板功能

    原生JS实现简单留言板功能,实现技术:css flex,原生JS. 因为主要是为了练手js,所以其中布局上的一些细节并未做处理. <!DOCTYPE html> <html lang ...

  2. 从零入门 Serverless | 使用 Spot 低成本运行 Job 任务

    作者 | 代志锋(云果)  阿里云技术专家 本文整理自<Serverless 技术公开课>,点击链接即可免费听课:https://developer.aliyun.com/learning ...

  3. DL4J实战之三:经典卷积实例(LeNet-5)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. res目录下的结构

    目录 res目录下的结构 drawable开头的文件夹 mipmap开头的文件夹 values开头的文件夹 layout文件夹 使用res目录下的资源 res目录下的结构 如果你展开res目录看一下, ...

  5. Hive SQL的底层编译过程详解

    本文结构采用宏观着眼,微观入手,从整体到细节的方式剖析 Hive SQL 底层原理.第一节先介绍 Hive 底层的整体执行流程,然后第二节介绍执行流程中的 SQL 编译成 MapReduce 的过程, ...

  6. suricata的模块和插槽

    参考资料 suricata官方文档https://suricata.readthedocs.io/en/latest/performance/runmodes.html#different-runmo ...

  7. nexus设置npm下载管理

    nexus设置npm下载管理 第一步 登录私服网页 第二步 创建存储空间(如果使用默认的存储空间,此步骤可省略) 第三步 输入空间的名称,点击create创建 第四步 创建仓库 npm的仓库有三种: ...

  8. SharkCTF2021 bybypass&baby_phpserialize题记

    (国庆褪10天了 先水一篇) bybypass: payload:?anime_is_bae=hehellotherehoomanllotherehooman baby_phpserialize ro ...

  9. Java中的函数式编程(五)Java集合框架中的高阶函数

    写在前面 随着Java 8引入了函数式接口和lambda表达式,Java 8中的集合框架(Java Collections Framework, JCF)也增加相应的接口以适应函数式编程.   本文的 ...

  10. 【UE4】基础概念——文件结构、类型、反射、编译、接口、垃圾回收、序列化

    新标签打开或者下载看大图 思维导图 Engine Structure Pipeline Programming Pipeline Blueprint Pipeline