Dividing the Path POJ - 2373 dp
题意:你有无数个长度可变的区间d 满足 2a<=d<=2b且为偶数. 现在要你用这些区间填满一条长为L(L<1e6且保证是偶数)的长线段。
满足以下要求:
1.可变区间之间不能有交集,且不能超过长线段的左右边界
2.长线段上有若干短线段,给出他们的起始点与终点。你要保证对于任意一条短线段,你的某个区间可以完全包含它。
求最少需要多少个可变区间。
题解:用dp[x]表示填到x距离所需要最少的可变区间数。
分析发现x必定满足:
1.偶数
2.x不能在某条短线段上//若不然,则x在某条短线段上,则说明这条短线段未被包含,可以令dp[x]=INF;
3.x>=2A;//换言之,对于x<2A的x,是无法满足要求的,可以令dp[x]=INF
4.当x>2B时,存在 x-2B<=y<=x-2A 且满足上面三条的y,使得f[x]=f[y]+1;
由此对应的递推方程:
技巧:对于取min操作,我们用priorityqueue来优化(nlogn),用-1来从小到大排queue。对于奶牛出现的位置用线性算法处理(n)。对于 x-2B<=y<=x-2A 的处理,直接就不把他们push进queue里了,然后及时把不符合的pop掉。
坑:以后一些明显没错的东西就别xjb乱改了//其实是少写了个=号,wa了一页。
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<queue>
#include<string.h>
using namespace std;
const int INF =1e9;
const int maxn = 1e3 + ;
const int maxl = 1e6 + ;
int dp[maxl];//长度为i时所需最少的喷头
int cow[maxl];//cow[i]==1代表有牛;用一个线性算法记录
int n, l, a, b;
priority_queue<pair<int,int>> qfx;
int main() {
cin >> n >> l;
cin >> a >> b;
a <<= , b <<= ;//覆盖直径
memset(cow, , sizeof(cow));
for (int i = ; i < n; i++) {
int s, e;
cin >> s >> e;
++cow[s + ];
--cow[e];
}
int incows = ;
for (int i = ; i <= l; i++) {
dp[i] = INF;
incows += cow[i];
cow[i] = (incows > );
}
for (int i = a; i <= b; i+=) if (!cow[i]) {
dp[i] = ;
if (i <= b + - a)qfx.push(make_pair(-,i));
}
for (int i = b + ; i <=l; i+=) {
if (!cow[i]) {
pair<int,int> now;
while (!qfx.empty()) {
now = qfx.top();
if (now.second < i - b) qfx.pop();
else break;
}
if (!qfx.empty()) dp[i] = -now.first + ;
}
if (dp[i -a+] != INF)qfx.push(make_pair(-dp[i - a + ],i - a + ));
}
if (dp[l] == INF) cout << -<<endl;
else cout << dp[l]<<endl;
return ;
}
Dividing the Path POJ - 2373 dp的更多相关文章
- Dividing the Path POJ - 2373(单调队列优化dp)
给出一个n长度的区间,然后有一些小区间只能被喷水一次,其他区间可以喷水多次,然后问你要把这个区间覆盖起来最小需要多少喷头,喷头的半径是[a, b]. 对于每个只能覆盖一次的区间,我们可以把他中间的部分 ...
- poj2373 Dividing the Path (单调队列+dp)
题意:给一个长度为L的线段,把它分成一些份,其中每份的长度∈[2A,2B]且为偶数,而且不能在某一些区间内部切开,求最小要分成几份 设f[i]为在i处切一刀,前面的满足要求的最小份数,则f[L]为答案 ...
- POJ 2373 Dividing the Path(DP + 单调队列)
POJ 2373 Dividing the Path 描述 农夫约翰的牛发现,在他的田里沿着山脊生长的三叶草是特别好的.为了给三叶草浇水,农夫约翰在山脊上安装了喷水器. 为了使安装更容易,每个喷头必须 ...
- poj 2373 Dividing the Path
Dividing the Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2858 Accepted: 1064 ...
- [POJ 2373][BZOJ 1986] Dividing the Path
Link: POJ 2373 传送门 Solution: 一开始想错方向的一道简单$dp$,不应该啊…… 我一开始的想法是以$cows' ranges$的节点为状态来$dp$ 但明显一个灌溉的区间的两 ...
- poj2373 Dividing the Path
Dividing the Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5060 Accepted: 1782 ...
- Prime Path(POJ - 3126)【BFS+筛素数】
Prime Path(POJ - 3126) 题目链接 算法 BFS+筛素数打表 1.题目主要就是给定你两个四位数的质数a,b,让你计算从a变到b共最小需要多少步.要求每次只能变1位,并且变1位后仍然 ...
- 【POJ】2373 Dividing the Path(单调队列优化dp)
题目 传送门:QWQ 分析 听说是水题,但还是没想出来. $ dp[i] $为$ [1,i] $的需要的喷头数量. 那么$ dp[i]=min(dp[j])+1 $其中$ j<i $ 这是个$ ...
- POJ 2373 Dividing the Path (单调队列优化DP)题解
思路: 设dp[i]为覆盖i所用的最小数量,那么dp[i] = min(dp[k] + 1),其中i - 2b <= k <= i -2a,所以可以手动开一个单调递增的队列,队首元素就是k ...
随机推荐
- SQL利用CASE按分组显示合计
按行显示的合计 select game, sum(purchase) as purchase_sum from purchase group by game; 按列显示的合计 select sum(c ...
- C#(少用的)
挖一挖C#中那些我们不常用的东西之系列(1)——ToDictionary,ToLookup 挖一挖C#中那些我们不常用的东西之系列(2)——IsXXX 系列方法 挖一挖C#中那些我们不常用的东西之系列 ...
- ZooKeeper 未授权访问漏洞
ZooKeeper 安装: Zookeeper的默认开放端口是2181 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zooke ...
- Splash args 属性
args属性可以获取加载时配置的参数,一般我们只传入URL,如下,args.url 就相当于加载时配置的URL参数,我们把它赋值给 url 变量然后返回:
- [Git] 解决 insufficient permission for adding an object to repository database
[环境] OS: CentOS 6.5 Git: 1.7.1 [症状描述] Git 中心仓库路径 ~/project.git,克隆库路径 ~/project.clone,克隆库中包含一个文件 ~/pr ...
- Nginx 72万连接性能测试(一)
转自:http://my.oschina.net/chenzhuo/blog/150200?p=2#comments 根据系统内存64G估算单台tengine做反向代理最高支持72万连接.为了验证达到 ...
- Linux下chkconfig命令详解转载
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...
- C++ template —— 实例化和模板实参演绎(四)
本篇讲解实例化和模板实参演绎-------------------------------------------------------------------------------------- ...
- 从Eclipse转移到IntelliJ IDEA的一点心得
IntelliJ使用指南—— 深入理解IntelliJ的Web部署逻辑 Intellij IDEA 部署Web项目,解决 404 错误 Intellij IDEA快捷键的使用 本文转载地址 本人使用I ...
- Undeclared identifier:XXX
未识别错误,是因拼写错误或找不到定义文件. 下面列举一些类型和函数用到的单元. _Stream ADODB_TLB akTop, akLeft, akRight, akBottom Controls ...