将所有线段的端点(即$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. vue 快速入门 系列 —— vue-router

    其他章节请看: vue 快速入门 系列 Vue Router Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌. 什么是路由 ...

  2. 使用CEF(四)— 在QT中集成CEF(1):基本集成

    QT作为C++下著名的跨平台软件开发框架,实现了一套代码可以在所有的操作系统.平台和屏幕类型上部署.我们前几篇文章讲解了如何构建一款基于CEF的简单的样例,但这些样例的GUI都是使用的原生的或者是控件 ...

  3. 使用CEF(二)— 基于VS2019编写一个简单CEF样例

    使用CEF(二)- 基于VS2019编写一个简单CEF样例 在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进 ...

  4. Spring配置文件结构对于生成Bean的影响

    Spring配置文件结构对于生成Bean的影响 有段时间忙于毕设,导致Spring学习的东西忘了很多,所以最近又开始从头看Spring的基础.基础的Bean的装配不再多说了.这一次,主要是深入一点了解 ...

  5. k8s学习笔记(2)- Rancher2.x部署springboot应用及高可用、扩容

    前言:上一篇介绍基于k3s环境,使用kubectl部署springboot简单项目应用,本篇介绍基于rancher2.x部署应用程序 1.上篇已部署一个springboot应用,我们可以通过ranch ...

  6. SignalR 在React/GO技术栈的生产应用

    哼哧哼哧半年,优化改进了一个运维开发web平台. 本文记录SignalR在react/golang 技术栈的生产小实践. 1. 背景 有个前后端分离的运维开发web平台, 后端会间隔5分钟同步一次数据 ...

  7. NX二次开发-调内部函数UGS::UICOMP_enum::set_width(int)更改BlockUI的枚举控件宽度

    版本 NX11+VS2013 内容说明 这个内部函数的设置方法,我之前不会,是QQ群里的一位大佬分享出来的. 关于这块,我也百度搜了一下,找到了几个相关的. 1.直接手动修改BlockUI界面 在低版 ...

  8. kettle使用

    Kettle的安装及简单使用 目录 Kettle的安装及简单使用 一.kettle概述 二.kettle安装部署和使用 Windows下安装 案例1:MySQL to MySQL 案例2:使用作业执行 ...

  9. shell关键字含义

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  10. Golang通脉之类型定义

    自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. type是Go语法里的重要而且常用的关键字,type绝 ...