[POJ 2373][BZOJ 1986] Dividing the Path
Link:
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的更多相关文章
- 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 ...
- poj2373 Dividing the Path
Dividing the Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5060 Accepted: 1782 ...
- 【POJ】2373 Dividing the Path(单调队列优化dp)
题目 传送门:QWQ 分析 听说是水题,但还是没想出来. $ dp[i] $为$ [1,i] $的需要的喷头数量. 那么$ dp[i]=min(dp[j])+1 $其中$ j<i $ 这是个$ ...
- Dividing the Path POJ - 2373(单调队列优化dp)
给出一个n长度的区间,然后有一些小区间只能被喷水一次,其他区间可以喷水多次,然后问你要把这个区间覆盖起来最小需要多少喷头,喷头的半径是[a, b]. 对于每个只能覆盖一次的区间,我们可以把他中间的部分 ...
- Dividing the Path POJ - 2373 dp
题意:你有无数个长度可变的区间d 满足 2a<=d<=2b且为偶数. 现在要你用这些区间填满一条长为L(L<1e6且保证是偶数)的长线段. 满足以下要求: 1.可变区间之间不能有 ...
- POJ 2373 Dividing the Path (单调队列优化DP)题解
思路: 设dp[i]为覆盖i所用的最小数量,那么dp[i] = min(dp[k] + 1),其中i - 2b <= k <= i -2a,所以可以手动开一个单调递增的队列,队首元素就是k ...
- HDU 3062 && HDU 1824 && POJ 3678 && BZOJ 1997 2-SAT
一条边<u,v>表示u选那么v一定被选. #include <iostream> #include <cstring> #include <cstdio> ...
- [USACO2004][poj2373]Dividing the Path(DP+单调队列)
http://poj.org/problem?id=2373 题意:一条直线分割成N(<=25000)块田,有一群奶牛会在其固定区域吃草,每1把雨伞可以遮住向左右延伸各A到B的区域,一只奶牛吃草 ...
随机推荐
- Unity插件
1.2D Toolkit 如果过去你一直从事3D游戏开发,最近想转做2D游戏,最好尝试一下2D Toolkit.2D Toolkit是一款2D开发组件,它具有很强的灵活性和适应性,能够让开发者在Uni ...
- ASP.NET Core 2.1 源码学习之 Options[3]:IOptionsMonitor 【转】
原文链接:https://www.cnblogs.com/RainingNight/p/strongly-typed-options-ioptions-monitor-in-asp-net-core. ...
- java 图形化界面笔记(1)
目录 JFrame窗体......................................................................................... ...
- [bzoj2038] [2009国家集训队]小Z的袜子
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只 ...
- [CF949C]Data Center Maintenance
题目大意:$n$个点,每个点有一个值$w_i$.$m$个条件,每个条件给出$x,y$,要求$w_x\not =w_y$.选择最少的点,使其值加$1$后,所有条件成立(数据保证有解). 题解:对于每个条 ...
- [NC2018-9-9T1]中位数
题目大意:给你一个长度为$n$的序列,要求出长度大于等于$len$的字段的中位数中最大的一个中位数 题解:可以二分答案,对于比它小的数赋成$-1$,大的赋成$1$.求前缀和,若有一段区间的和大于$0$ ...
- CodeForces 549H | 二分答案
参考了这个博客哇 #include<cstdio> #include<algorithm> #include<cstring> #define Max(a,b,c, ...
- 设置(settings)
设置(settings) 题目描述 如题所示,这将是一个关于设置的问题. 你需要通过对一个控制台进行设置,来得到不同的效果. 这个控制台由n个控制元件组成,每个元件有m种设置,其中i号元件的第j种设置 ...
- NOIP2017赛前考试注意事项总结
考前: 考试前把读入优化和库以及对拍文件打好做好准备工作,另外注意放松心态,太紧张了肯定考不好··将自己的注意力集中起来 考场策略: 考试的基本策略是对每于道题先想个20分钟,如果想不出个靠谱的方 ...
- Codeforces:Good Bye 2018(题解)
Good Bye 2018! 题目链接:https://codeforces.com/contest/1091 A. New Year and the Christmas Ornament 题意: 给 ...