Link:

POJ 2373 传送门

Solution:

一开始想错方向的一道简单$dp$,不应该啊……

我一开始的想法是以$cows' ranges$的节点为状态来$dp$

但明显一个灌溉的区间的两边不一定都在$cows's ranges$上,

因此应该以长为$L$的$field$上的每一个偶数节点为状态来$dp$,

这样转移方程就很容易了:

$dp[i]=min\{ dp[j] \} +1(2*a\le i-j\le 2*b)$

由于$dp[j]$具有决策单调性(对于节点$i$,$k$比$j$更优$(j<k)$,那么对于后面任意一个节点$j$都优于$k$)

于是使用单调队列维护一个$dp$值递增,离起点距离递增的序列,每次弹出$i-q[l]>=2*b$的$l$

为了处理$cows' ranges$上的节点,使用差分将在区间内的节点打上标记,遇到时跳过即可

Note:这里的特判依然要注意,如果对于一个非终点的节点找不到符合的点,不代表无解!跳过即可

Code:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring> using namespace std;
const int MAXN=1e6+; int n,L,a,b,dp[MAXN],pre[MAXN],q[MAXN],l,r; int main()
{
scanf("%d%d%d%d",&n,&L,&a,&b);
for(int i=;i<=n;i++)
{
int x,y;scanf("%d%d",&x,&y);
pre[x+]++;pre[y]--;
if(y-x>*b){printf("-1");return ;}
}
for(int i=;i<=L;i++) pre[i]+=pre[i-]; l=r=;q[]=;
for(int i=*a;i<=L;i+=)
{
if(pre[i]) continue;
while(l<=r && i-q[l]>*b) l++;
if(l>r){printf("-1");return ;}
if(i-q[l]<*a) continue; //对不符合条件的数的处理 dp[i]=dp[q[l]]+;
while(l<=r && dp[i]<dp[q[r]]) r--;q[++r]=i;
}
if(!dp[L]) printf("-1"); //特例处理
else printf("%d",dp[L]);
return ;
}

Review:

(1)还是要对特判细节想清楚啊……

(2)对于有决策单调性的题目想到单调性优化

(3)选择$dp$状态时要考虑状态集是否包含了所有“过程”中的“终点”

(如果按$cows' ranges$选取则不能)

[POJ 2373][BZOJ 1986] Dividing the Path的更多相关文章

  1. POJ 2373 Dividing the Path(DP + 单调队列)

    POJ 2373 Dividing the Path 描述 农夫约翰的牛发现,在他的田里沿着山脊生长的三叶草是特别好的.为了给三叶草浇水,农夫约翰在山脊上安装了喷水器. 为了使安装更容易,每个喷头必须 ...

  2. poj 2373 Dividing the Path

    Dividing the Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2858   Accepted: 1064 ...

  3. poj2373 Dividing the Path

    Dividing the Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5060   Accepted: 1782 ...

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

    题目 传送门:QWQ 分析 听说是水题,但还是没想出来. $ dp[i] $为$ [1,i] $的需要的喷头数量. 那么$ dp[i]=min(dp[j])+1 $其中$ j<i $ 这是个$ ...

  5. Dividing the Path POJ - 2373(单调队列优化dp)

    给出一个n长度的区间,然后有一些小区间只能被喷水一次,其他区间可以喷水多次,然后问你要把这个区间覆盖起来最小需要多少喷头,喷头的半径是[a, b]. 对于每个只能覆盖一次的区间,我们可以把他中间的部分 ...

  6. Dividing the Path POJ - 2373 dp

    题意:你有无数个长度可变的区间d  满足 2a<=d<=2b且为偶数. 现在要你用这些区间填满一条长为L(L<1e6且保证是偶数)的长线段. 满足以下要求: 1.可变区间之间不能有 ...

  7. POJ 2373 Dividing the Path (单调队列优化DP)题解

    思路: 设dp[i]为覆盖i所用的最小数量,那么dp[i] = min(dp[k] + 1),其中i - 2b <= k <= i -2a,所以可以手动开一个单调递增的队列,队首元素就是k ...

  8. HDU 3062 && HDU 1824 && POJ 3678 && BZOJ 1997 2-SAT

    一条边<u,v>表示u选那么v一定被选. #include <iostream> #include <cstring> #include <cstdio> ...

  9. [USACO2004][poj2373]Dividing the Path(DP+单调队列)

    http://poj.org/problem?id=2373 题意:一条直线分割成N(<=25000)块田,有一群奶牛会在其固定区域吃草,每1把雨伞可以遮住向左右延伸各A到B的区域,一只奶牛吃草 ...

随机推荐

  1. create vm

    #!/bin/sh echo $# [ $# < ] && { echo "error" exit } instance_name=$ instance_ip ...

  2. C# Socket通信的服务器与客户端

    客户端代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...

  3. JavaWeb笔记(五)JSP

    JSP 指令 格式: <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %> 分类: page 配置JSP页面 contentType:等同于response.setCon ...

  4. Python函数参数中的冒号与箭头

    在一些Python的工程项目中,我们会看到函数参数中会有冒号,有的函数后面会跟着一个箭头,你可能会疑惑,这些都是什么东西? 其实函数参数中的冒号是参数的类型建议符,告诉程序员希望传入的实参的类型.函数 ...

  5. [bzoj3456] 城市规划 [递推+多项式求逆]

    题面 bzoj权限题面 离线题面 思路 orz Miskcoo ! 先考虑怎么算这个图的数量 设$f(i)$表示$i$个点的联通有标号无向图个数,$g(i)$表示$n$个点的有标号无向图个数(可以不连 ...

  6. 关于flink的时间处理不正确的现象复现&原因分析

    跟朋友聊天,说输出的时间不对,之前测试没关注到这个,然后就在processing模式下看了下,发现时间确实不正确 然后就debug,看问题在哪,最终分析出了原因,记录如下:    最下面给出了复现方案 ...

  7. JavaScript 代码性能优化总结

    本文转自:http://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=400360237&idx=2&sn=eb00241cb3b ...

  8. FreeFileSync

    FreeFileSync is an Open-Source folder comparison and synchronization tool. It is optimized for highe ...

  9. getElementsByName

    name属性,name属性是input标签的内建属性,早期浏览器的getElementsByName方法是为了方便的获取用户的输入.由于name只是input的内建属性,其它标签没有,所以getEle ...

  10. sql server创建外键,子母表,级联删除。

    级联删除. 最近建一个合同关系,在原有的资产平台上添加维保合同关系,维保合同问题, 需要在后面添加资产的维保合同,使用ef,该添加的冗余字段都已经添加上了,现在做这个,删除的时候只删了主表提示出问题, ...