本题难点在正确性证明。

令 \(f_i\) 表示 \([1,i]\) 被全部覆盖的最小花费。答案为 \(f_m\)。

首先发现,添加一个区间 \([0,0]\) 不会影响答案。所以 \(f_i\) 的初值可以设为 \(i\)。(这个很重要,没了就不对了!)

转移,如果 \(i\) 已经被某个初始区间完全覆盖了,那么可以从 \(f_{i-1}\) 转移来。

然后枚举每个区间,如果区间的右端点在 \(i\) 左边,计算把这个区间扩张到能恰好覆盖到 \(i\) 后的左端点。也就是从 \(f_{\max(0,l[j]-(i-r[j]))}+i-r[j]\) 转移来。

记下每个区间被扩张成什么样会炸状态,所以直接从初始的区间开始扩张。

时间复杂度 \(O(nm)\)。

开始证明正确性。

首先证明只用考虑被左边的区间覆盖,不需要考虑右边的。

其实被右边的区间覆盖也被考虑过了,不过转移的时候就直接跳过了这些点(在这个被扩张后的区间中)。所以不用管。

接下来证明直接从初始的区间开始扩张就是最优解。

如果需要在被扩张的区间的基础上继续扩张,说明这次扩张到的点 \(i\) 一定在上次扩张到的点 \(j\) 的右边,扩张到 \(i\) 后的区间的左端点一定跳过了 \(j\)。而我们最后要用到的是 \(i\) 的状态(因为需要继续扩张),所以中间这第一次扩张是没有必要的。

所以这种情况不可能发生。

接下来证明恰好扩张到能覆盖 \(i\) 就是最优解,也就是最优解不需要扩张到覆盖超过 \(i\) 一点点。

如果需要扩张更多,一定是因为可以覆盖左边的更多点,让左边的区间更短(不然覆盖到超过 \(i\) 的位置在 \(f_i\) 是完全没有必要的)。

但是由于添加了区间 \([0,0]\)(没错,它的作用就在这),一定有 \(f_{i+1}\le f_i+1\)(因为覆盖到 \(i\) 的区间可以再扩展一格)。

所以跳过区间后的转移点应该是越右越好。也就是不需要扩展到 \(i\) 右边。

于是这个就是对的了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=100010;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
char ch=getchar();ll x=0,f=0;
while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
int n,m,x[maxn],s[maxn],f[maxn];
int main(){
n=read();m=read();
FOR(i,1,n) x[i]=read(),s[i]=read();
f[0]=0;
FOR(i,1,m){
f[i]=i;
bool flag=false;
FOR(j,1,n) if(x[j]+s[j]>=i && x[j]-s[j]<=i) flag=true;
if(flag) f[i]=f[i-1];
FOR(j,1,n) if(x[j]+s[j]<i) f[i]=min(f[i],f[max(0,2*x[j]-i-1)]+i-(x[j]+s[j]));
}
printf("%d\n",f[m]);
}

CF1253E Antenna Coverage(DP)的更多相关文章

  1. E. Antenna Coverage (dp)

    传送门 题意: 在一个一维坐标上,有 n 个东西, 每个东西, 用 xi, si 表示 这个东西在 xi 位置上, 它能覆盖到的区间为 [ xi - si, xi + si ]: 然后, 你可以对任意 ...

  2. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  3. lightOJ 1047 Neighbor House (DP)

    lightOJ 1047   Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...

  4. UVA11125 - Arrange Some Marbles(dp)

    UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...

  5. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

  6. 初探动态规划(DP)

    学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...

  7. Python项目在Jenkins中的自动化测试实践(语法检查、单元测试,coverage(代码覆盖率)、自动打包)

    原始链接:http://blog.csdn.net/a464057216/article/details/52934077 requirments OS: Ubuntu 14.04+ Gitlab 8 ...

  8. Tour(dp)

    Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...

  9. 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)

    .navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...

随机推荐

  1. Android View的background和padding

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/181 最近在做一个需求,是对im聊天消息设置气泡背景,之前 ...

  2. InnoDB On-Disk Structures(一)-- Tables (转载)

    转载.节选于https://dev.mysql.com/doc/refman/8.0/en/innodb-tables.html 1.InnoDB Architecture The following ...

  3. [MySQL] mysql中bitmap的简单运用

    bitmap就是在一个二进制的数据中,每一个位代表一定的含义,这样最终只需要存一个整型数据,就可以解释出多个含义.业务中有一个字段专门用来存储用户对某些功能的开启和关闭,如果是传统的思维,肯定是建一个 ...

  4. 五、如何通过CT三维图像得到DRR图像

    一.介绍 获取DRR图像是医疗图像配准里面的一个重要的前置步骤:它的主要目的是,通过CT三维图像,获取模拟X射线影像,这个过程也被称为数字影响重建. 在2D/3D的配准流程里面,需要首先通过CT三维图 ...

  5. JavaScript-----10.作用域

    1.作用域 一段程序代码中所用到的名字不是总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域.目的是为了提高程序的可靠性,更重要的是减少命名冲突. 在es6之前,js的作用域有:全 ...

  6. VMware® Workstation 15 Pro 最新版软件安装教程

    VMware 15 Pro下载地址: https://pan.baidu.com/s/1ILY2PTqB-BaJMn2hbKO4CA 提取码:vebd 如有问题咨询QQ:2217084817 VMwa ...

  7. ASP.NET中的身份验证

    身份验证方式windows passport form none授权allow 允许deny 拒绝特殊符号 *代表所有用户 ?代表匿名用户跳转配置<system.web><autho ...

  8. 将python项目打包为可运行的windows桌面exe程序

    ---恢复内容开始--- 步骤大概如下: 1.需要一个python文件/项目.也就是我们想要打包的文件 2.安装pyinstaller,目的是将我们的python文件生成为exe可执行程序. 3.使用 ...

  9. PlayJava Day014

    今日所学: /* 2019.08.19开始学习,此为补档. */ 1.Random生成的随机数是伪随机数,因为只要两个Random对象的种子相同,而且方法的调用顺序也相同,则产生的随机数相同. Ran ...

  10. CRM第二篇

    检索策略 : 相当于优化查询,主要是分为立即加载和延迟加载. 当你查询一个对象的时候,要想立马使用这个对象,或者说是立即查询出来,就使用立即加载. 当你查询这个对象时候不想立马查询出来,而是在使用这个 ...