BZOJ1986: [USACO2004 Dec] Dividing the Path 划区灌溉
L<=1000000的土地上用长度在2*A~2*B的线段覆盖所有点,且给定n<=1000个区间,每个区间上只允许有一条线段,求最少多少线段,无解-1。
f[i]表示填前i个土地最少线段,f(i)=f(j)+1,2*A<=i-j<=2*B,用个单调队列就行。注意区间是左闭右开。
至于那些坏区间,如果某个状态在覆盖了该点的区间的最远的右端点,那是合法的,否则一旦它被覆盖就是不合法状态。
为了处理这种情况,将区间按左端点排序,走到一个点时,若该点满足上面的情况,那就说明有一些区间的左端点<=i,把这些区间的右端点取个最大值来比较即可。出现这种情况后,把当前状态,以及当前状态到最远被覆盖区间右端点这些状态全部变成inf,然后i跳到那个右端点就可以做了。
不过,单调队列的节点添加不稳定,因此记个“单调队列加到哪里了”,这样就不怕跳来跳去的i了。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
using namespace std; int n,L,A,B;
#define maxn 1000011
struct Cow
{
int l,r;
bool operator < (const Cow &b) const {return l<b.l;}
}a[maxn];
int f[maxn],que[maxn],head,tail;
const int inf=0x3f3f3f3f;
int main()
{
scanf("%d%d%d%d",&n,&L,&A,&B);
for (int i=;i<=n;i++)
scanf("%d%d",&a[i].l,&a[i].r),a[i].l++;
sort(a+,a++n);
head=tail=;
int last=,k=;
if (L&) puts("-1");
else
{
for (int i=;i<=L;i+=)
{
while (head<tail && que[head]<i-*B) head++;
for (int j=last;j<=i-*A;j+=)
{
while (head<tail && f[que[tail-]]>=f[j]) tail--;
que[tail++]=j;
}
last=max(last,i-*A+);
int far=;
while (k<=n && i>=a[k].l)
{
far=max(far,a[k].r);
k++;
}
if (i<far)
{
int tmp=((far&)?far+:far)-;
for (;i<tmp;i+=) f[i]=inf;f[i]=inf;
last=max(last,i-*B+);
continue;
}
if (head<tail) f[i]=f[que[head]]+;
else f[i]=inf;
}
printf(f[L]>=inf?"-1\n":"%d\n",f[L]);
}
return ;
}
BZOJ1986: [USACO2004 Dec] Dividing the Path 划区灌溉的更多相关文章
- [USACO2004][poj2373]Dividing the Path(DP+单调队列)
http://poj.org/problem?id=2373 题意:一条直线分割成N(<=25000)块田,有一群奶牛会在其固定区域吃草,每1把雨伞可以遮住向左右延伸各A到B的区域,一只奶牛吃草 ...
- 【BZOJ】【1986】【USACO 2004 Dec】/【POJ】【2373】划区灌溉
DP/单调队列优化 首先不考虑奶牛的喜欢区间,dp方程当然是比较显然的:$ f[i]=min(f[k])+1,i-2*b \leq k \leq i-2*a $ 当然这里的$i$和$k$都是偶数啦~ ...
- 【Noip模拟 20160929】划区灌溉
题目描述 约翰的奶牛们发现山脊上的草特别美味.为了维持草的生长,约翰打算安装若干喷灌器. 为简化问题,山脊可以看成一维的数轴,长为L(1≤L≤1,000,000)L(1≤L≤1,000,000),而且 ...
- 1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(题解第二弹)
1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: ...
- 1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(题解第一弹)
1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: ...
- POJ 2373 Dividing the Path(DP + 单调队列)
POJ 2373 Dividing the Path 描述 农夫约翰的牛发现,在他的田里沿着山脊生长的三叶草是特别好的.为了给三叶草浇水,农夫约翰在山脊上安装了喷水器. 为了使安装更容易,每个喷头必须 ...
- HTML基础(二)——表单,图片热点,网页划区和拼接
一.表单 <form id="" name="" method="post/get" action="负责处理的服务端&qu ...
- HTML:图片热点 网页划区 表单
图片热点: 划出图片中的区域,做超链接,点击该区域就可以直接跳转到链接网站 <img src="../../../3.jpg" title="血精灵" u ...
- HTML · 图片热点,网页划区,拼接,表单
图片热点: 规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可以完成跳转的效果. 网页划区: 在一个网页里,规划出一个区域用来展示另一个网页的内容. 网页的拼接: 在一个网络页面内,规划出多 ...
随机推荐
- subprocess模块详解2
1.call() 和run功能类似,都是接受一个列表里的参数. >>> import subprocess >>> a = subprocess.call([&qu ...
- CF985D Sand Fortress
思路: 很奇怪的结论题,不好想.参考了http://codeforces.com/blog/entry/59623 实现: #include <bits/stdc++.h> using n ...
- Android Platform Version 和 API Level对照
Platform Version API Level VERSION_CODE Notes Android 5.1 22 LOLLIPOP_MR1 Platform Highlights Androi ...
- Android学习笔记(十七) BroadcastReceiver
1.接收广播 创建一个类,继承BroadcastReceiver,复写其中的onReceive()方法 在AndroidManifest.xml文件中注册该BroadcastReceiver 设置完成 ...
- CFBundleURLTypes URL scheme
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Ar ...
- docker 的容器入门
Linux Namespace LXC所实现的隔离性主要是来自kernel的namespace, 其中pid, net, ipc, mnt, uts 等namespace将container的进程, ...
- CNN完成mnist数据集手写数字识别
# coding: utf-8 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data d ...
- PHP07 函数
学习要点 函数的定义 自定义函数 函数的工作原理和结构化编程 PHP变量范围 声明及应用各种形式的PHP函数 递归函数 使用自定义函数库 匿名函数和闭包 常用PHP系统函数 PHP7函数新特性 函数的 ...
- web.config中配置数据库连接的两种方式
在ASP.NET中有两种配置数据库连接代码的方式,它们分别是 appSettings 和 connectionStrings .在使用 appSettings 和 connectionStrings ...
- Oracle中的for和while循环
实例: beginfor i in 51..500 loop delete from test t where t.date=to_date('2016-07-01', 'yyyy-MM-dd') a ...