【POJ - 2373】Dividing the Path(单调队列优化dp)

题干:

Farmer John's cows have discovered that the clover growing along the ridge of the hill in his field is particularly good. To keep the clover watered, Farmer John is installing water sprinklers along the ridge of the hill. 

To make installation easier, each sprinkler head must be installed along the ridge of the hill (which we can think of as a one-dimensional number line of length L (1 <= L <= 1,000,000); L is even). 

Each sprinkler waters the ground along the ridge for some distance in both directions. Each spray radius is an integer in the range A..B (1 <= A <= B <= 1000). Farmer John needs to water the entire ridge in a manner that covers each location on the ridge by exactly one sprinkler head. Furthermore, FJ will not water past the end of the ridge in either direction. 

Each of Farmer John's N (1 <= N <= 1000) cows has a range of clover that she particularly likes (these ranges might overlap). The ranges are defined by a closed interval (S,E). Each of the cow's preferred ranges must be watered by a single sprinkler, which might or might not spray beyond the given range. 

Find the minimum number of sprinklers required to water the entire ridge without overlap. 

Input

* Line 1: Two space-separated integers: N and L 

* Line 2: Two space-separated integers: A and B 

* Lines 3..N+2: Each line contains two integers, S and E (0 <= S < E <= L) specifying the start end location respectively of a range preferred by some cow. Locations are given as distance from the start of the ridge and so are in the range 0..L.

Output

* Line 1: The minimum number of sprinklers required. If it is not possible to design a sprinkler head configuration for Farmer John, output -1.

Sample Input

2 8
1 2
6 7
3 6

Sample Output

3

Hint

INPUT DETAILS: 

Two cows along a ridge of length 8. Sprinkler heads are available in integer spray radii in the range 1..2 (i.e., 1 or 2). One cow likes the range 3-6, and the other likes the range 6-7. 

OUTPUT DETAILS: 

Three sprinklers are required: one at 1 with spray distance 1, and one at 4 with spray distance 2, and one at 7 with spray distance 1. The second sprinkler waters all the clover of the range like by the second cow (3-6). The last sprinkler waters all the clover of the range liked by the first cow (6-7). Here's a diagram: 

                 |-----c2----|-c1|       cows' preferred ranges|---1---|-------2-------|---3---|   sprinklers+---+---+---+---+---+---+---+---+0   1   2   3   4   5   6   7   8The sprinklers are not considered to be overlapping at 2 and 6.

题目大意:

(这个示意图是真误导人啊,还是来说说更详细的题意吧)

在长为L(<=1000000)的草地(可看成一维的线段)上装喷水头,喷射是以这个喷水头为中心,喷水头的喷洒半径是可调节的(但是这题的喷水头只用考虑一个维度的,即不需要看成是个二维平面的一个圆),调节范围为[A,B](注意这里需要理解成,安装完毕的喷水头,喷洒半径就是个定值了,不能来回改变。换句话说这里可以这么理解,市场中有多种喷水头,喷水半径分别是[A,B]中的整数)。要求草地的每个点被且只被一个喷水头覆盖。接下来给你N头牛,给出每头牛的活动范围,并且要求在这个活动范围内只能有一个喷水头来覆盖,也就是不能被两个喷水头来拼接覆盖(也就是不能由多个喷头分段完全覆盖)。求使用喷水头的最小数目。(还有个要求,喷水头不能喷到0~L之外的区域)

解题报告:

注意到因为有“每个点只能被一个喷水头覆盖”的限制,所以喷水头的半径不是选择的越大越好。

明确了题意之后我们来考虑简化一下题目给的信息和要求。

首先我们要把喷头等价到右端点上,不然没法做。也就是把以“每个喷水头可以喷洒到喷水头为中心的一个双向区域”的这个信息变成“喷水头固定放到整个喷洒区域的右端点,也就是每个喷水头只可以向左喷洒”(这就像是 dp前构造一个贪心的策略一样,相当于根据题目中这一个  “ 与喷头放置具体位置无关,只需要关心喷洒区域 ”  的性质,我们在不改变题目含义的情况下强行加一个条件来方便我们进行处理,这一点技巧很常用)

设dp[i]代表完全覆盖 0~i 这个区域,需要的最少喷水头是多少。首先注意到每一个奶牛的区间只能被一个喷头喷到,而你要进行后面的处理dp[i]如果是合法的,肯定是要由某个合法的dp[j]  ( i - 2*B <= j <= i - 2*A ) 转移过来。(显然满足dp的无后效性性质,这一点就不证明了)

那么现在题目中还剩下一个限制条件我们还没有用到,那就是每头牛的活动区域只能用一个喷水头单独覆盖,那么根据我们刚刚的假设:喷头等价到右端点上,所以对于中间的每一个点都是不需要处理直接dp[]=INF的。(当然虽然dp值不需要处理,但是单调队列还是要维护的)(这也可见等价转化这个假设是多么的重要

还有一点是需要注意的,这题因为要求是所有点都要被覆盖,所以要求合法点一定是偶数点,并且要求题目输入的L一定是偶数,不然肯定是非法的。所以你在遍历的时候遇到奇数点可以直接略过了(但是代码中写了,主要是因为要处理差分数组的原因),之所以可以直接略过其实是因为,这题不论维护的哪一个信息,其实都和奇数位置的点没关系,而唯一起作用的地方就是在牛的活动范围那里,用以判断接下去的偶数点是否dp[]值需要是非法值。(这题中奇数位置上的点的dp值甚至都不需要去管,因为全程没用到)

感受dp的奇妙吧!dp经常可以附带一个附加效果就是可以把非法情况直接给带出来了,比如这题就不需要取特判-1的情况,而是直接去dp数组中取数就可以了。

至于为什么考虑奇数的点就会WA呢?按理来说dp也是可以处理这种非法情况的呀?但是请考虑这样一个问题,你的喷洒头的长度是偶数的(因为乘以2算直径了嘛)如果你那么用的话,那么队列中不止会有偶数距离的值,还会存了奇数距离,而奇数距离是非法的!(因为喷洒的直径肯定是偶数)那么你在单调队列取值的时候就需要用判断的方式来得到需要的解了,而不是刻意直接取数就是答案。(我感觉是因为这个原因,当然也可能是其他原因吧,反正奇数的在这个题中本就是卵用没有呀)

再就是代码细节比较多,比如维护单调性的时候必须要i-A>=0(别忘等号!因为dp[0]本身就是要用到的合法解),但是维护区域的时候就不需要i-A>=0。

至于为什么需要i-A>=0,还是因为题意:喷泉不能喷出去...比如线段的长度是4..而我手上的喷泉能喷的距离是(2~3)...结果是-1...因为不论我喷泉在0-3的范围放哪里...所以按照题意应该输出-1、

还有个问题,为什么这题可以用单调队列呢?因为A和B都是常数,所以维护的窗口肯定是单调的往后移动的,所以可以这样。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define F first
#define S second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e6 + 5;
const int INF = 0x3f3f3f3f;
int c[MAX];
int n,L,A,B;
deque<int> dq;
int dp[MAX];
int main()
{cin>>n>>L;cin>>A>>B;A*=2,B*=2; for(int s,e,i = 1; i<=n; i++) {scanf("%d%d",&s,&e);s++,e--;c[s]++;c[e+1]--;}dp[0]=0;for(int i = 1; i<=L; i++) {c[i] += c[i-1];if(i & 1) continue;while(dq.size() && dq.front() < i - B) dq.pop_front();if(i-A>=0) {while(dq.size() && dp[dq.back()] > dp[i-A]) dq.pop_back();dq.push_back(i-A); } if(dq.size() && dp[dq.front()] < INF && c[i] == 0) dp[i] = dp[dq.front()]+1;else dp[i] = INF;}if(dp[L] == INF) printf("-1");else printf("%d",dp[L]);return 0 ;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu16.4(64位)下gcc-linaro-arm-linux-gnueabihf交叉编译环境安装

1. 下载压缩包 文件分享 2. 新建目录并解压 3. 配置环境变量 sudo gedit /etc/bash.bashrc 添加路径并更新路径&#xff1a;&#xff08;PATH$PATH之间无空格&#xff09; PATH$PATH://linaro-arm/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/binexport P…

JAVA高级工程师课程笔记整理——(八)tomcat与九大内置对象

&#xff08;八&#xff09;tomcat与九大内置对象 tomcat B/S 浏览器/服务器 请求&#xff1a;request 响应: response C/S&#xff1a; 客户端/服务器 URL: 网址 URI: 范围包括url http https: 更安…

tshark 小技巧

将pcap转换成json文件&#xff0c;全部特征名都会在json中 tshark -T json -r D:\test.pcap > test.json合并数据包 mergecap -w all.pcap 1.pcap 2.pcap ...all.pcap: 合并之后的数据包 1.pcap ... 要合并的数据包&#xff0c;可以合并n个

【CodeForces - 1201C】Maximum Median(思维,水题)

题干&#xff1a; You are given an array aa of nn integers, where nn is odd. You can make the following operation with it: Choose one of the elements of the array (for example aiai) and increase it by 11(that is, replace it with ai1ai1). You want to make …

Apollo进阶课程 ④ | 开源模块讲解(下)

目录 1&#xff09;Apollo平台技术框架 2&#xff09;Apollo版本迭代 原文链接&#xff1a;​Apollo进阶课程 ④ | 开源模块讲解&#xff08;下&#xff09; 上周&#xff0c;阿波君与大家讨论了自动驾驶的核心问题——安全性。本期&#xff0c;我们将为大家具体介绍百度Apo…

SM4 简介

SM4 我国国家密码管理局在20012年公布了无线局域网产品使用的SM4密码算法——商用密码算法。它是分组算法当中的一种&#xff0c;算法特点是设计简沽&#xff0c;结构有特点&#xff0c;安全高效。数据分组长度为128比特&#xff0c;密钥长度为128 比特。加密算法与密钥扩展算法…

九大内置对象

指在JSP的<%%> 和<% %>中可以直接使用的对象&#xff1a;没有特别说明可以开关的默认是开启的 一servlet理论上可以处理多种形式的请求响应形式http只是其中之一所以HttpServletRequest HttpServletResponse分别是ServletRequest和ServletResponse的之类 二 Http…

3)机器学习基石笔记 Lecture3:Types of Learning

目录 1&#xff09;Learning with Different Output Space Y 2&#xff09;Learning with Different Data Label 3&#xff09;Learning with Different Protocol 4&#xff09;Learning with Different Input Space X 在上一节课中&#xff0c;我们学到了第一个机器学习…

【BZOJ - 3436】小K的农场(差分约束)

题干&#xff1a; 背景 小K是个特么喜欢玩MC的孩纸。。。 描述 小K在MC里面建立很多很多的农场&#xff0c;总共n个&#xff0c;以至于他自己都忘记了每个农场中种植作物的具体数量了&#xff0c;他只记得 一些含糊的信息&#xff08;共m个&#xff09;&#xff0c;以下列…

分组密码简介和五大分组模式

分组密码 分组密码&#xff08;blockcipher&#xff09;是每次只能处理特定长度的一块数据的一类密码算法&#xff0c;这里的一块"就称为分组&#xff08;block&#xff09;。此外&#xff0c;一个分组的比特数就称为分组长度&#xff08;blocklength&#xff09;。例如&…

Java Web(五) JSP详解(四大作用域九大内置对象等)

前面讲解了Servlet&#xff0c;了解了Servlet的继承结构&#xff0c;生命周期等&#xff0c;并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解&#xff0c;但是我们会发现在Servlet中编写一些HTML代码&#xff0c;是很不方便的一件事情&#xff0c;每次都…

Apollo进阶课程 ⑤ | Apollo硬件开发平台介绍

目录 1&#xff09;Uber事故原因分析 2&#xff09;自动驾驶的第一天条-----安全 3&#xff09;自动驾驶汽车的硬件系统 4&#xff09;自动驾驶汽车感知类传感器介绍 5&#xff09;自动驾驶汽车的传感器 6&#xff09;自动驾驶的计算单元 7&#xff09;自动驾驶的线控系…

【HDU - 3440】House Man(差分约束)

题干&#xff1a; In Fuzhou, there is a crazy super man. He can’t fly, but he could jump from housetop to housetop. Today he plans to use N houses to hone his house hopping skills. He will start at the shortest house and make N-1 jumps, with each jump tak…

使用tcpdump,adb进行手机抓包

准备 手机 root PC安装ADB 下载压缩包&#xff0c;解压即可 链接&#xff1a;https://pan.baidu.com/s/1Hv-IqpQutBVTHuriakQUTg 提取码&#xff1a;q57q 配置环境变量 在系统环境Path中添加 adb.exe 的地址 验证安装 adb version 出现版本&#xff0c;即为成功 开启adb服…

依赖注入和控制反转的理解,写的太好了。

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念&#xff0c;对于初学Spring的人来说&#xff0c;总觉得IoC 、DI这两个概念是模糊不清的&#xff0c;是很难理解的&#xff0c;今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及…

Apollo进阶课程 ⑥ | 高精地图与自动驾驶的关系

目录 1&#xff09;高精地图与自动驾驶 2&#xff09;什么是高精地图 3&#xff09;高精地图与导航地图 4&#xff09;高精地图---无人驾驶的核心基础模块 5&#xff09;高精地图与定位模块的关系 6&#xff09;高精地图与感知模块的关系 7&#xff09;高精地图与规划、…

【POJ - 1275】Cashier Employment(差分约束,建图)

题干&#xff1a; A supermarket in Tehran is open 24 hours a day every day and needs a number of cashiers to fit its need. The supermarket manager has hired you to help him, solve his problem. The problem is that the supermarket needs different number of c…

InfluxDB 简介、安装和简单使用

简介 InfluxDB是一个由InfluxData开发的开源时序型数据库。它由Go写成&#xff0c;着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据&#xff0c;IoT行业的实时数据等场景。可以理解为按时间记录一些数据&#xff08;常用的监控数据、埋点统计数据…

4)机器学习基石笔记 Lecture4:Feasibility of Learning

目录 1&#xff09;Learning is Impossible 2&#xff09;Probability to the Rescue 3&#xff09;Connection to Learning 4&#xff09;Connection to Real Learning 上节课我们主要介绍了机器学习问题的类型&#xff0c;主要是二元分类和回归问题。本节课&#xff0c;我…

Java注解全面解析

1.基本语法 注解定义看起来很像接口的定义。事实上&#xff0c;与其他任何接口一样&#xff0c;注解也将会编译成class文件。 Target(ElementType.Method)Retention(RetentionPolicy.RUNTIME)public interface Test {} 除了符号以外&#xff0c;Test的定义很像一个空的接口。…