【NOIP2017】跳房子 题解(单调队列优化线性DP)
前言:把鸽了1个月的博客补上
-----------------
题目大意:机器人的灵敏性为$d$。每次可以花费$g$个金币来改造机器人,那么机器人向右跳的范围为$[min(d-g,1),max(d+g,x[n])]$。每个点都有分数$w[i]$。问至少花费多少金币得到分数$k$?
首先,如果用$g$个金币能满足条件,那么$g+1$也能。显然我们要最大值最小,所以我们不妨二分$g$,来求得满足条件的$g$的最小值。
普通的dp应该还是比较好写的。可以拿60pts.
bool check(int g)
{
for (int i=;i<=n;i++) f[i]=-0x3f3f3f3f;f[]=;
int rpos=d+g,lpos=max(d-g,);
for (int i=;i<=n;i++)
{
for (int j=i=;j>=;j--)
{
if (x[i]-x[j]<lpos) continue;
if (x[i]-x[j]>rpos) break;
f[i]=max(f[i],f[j]+w[i]);
if (f[i]>=k) return ;
}
}
return ;
}
对于每一个i,都有一定的可取范围(l,r)。注意到l,r都是单调递增的,且dp方程为$f[i]=max(f[j])+w[i]$,我们可以尝试用单调队列优化。时间复杂度$O(n)$。
bool check(int g)
{
memset(q,,sizeof(q));
memset(f,0x80,sizeof(f));f[]=;
int l=,r=,j=;
int L=d-g,R=d+g;
if (L<) L=;
for (int i=;i<=n;i++)
{
while(x[i]-x[j]>=L&&j<i)
{
if (f[j]!=neInf)//f[j]必须是已经更新过的
{
while(l<=r&&f[q[r]]<=f[j]) r--;//把劣于f[j]的决策排除,因为无论如何都不可能选择它们
q[++r]=j;//入列
}
j++;
}
while(l<=r&&x[i]-x[q[l]]>R) l++;//把不满足条件的排除
if (l<=r) f[i]=f[q[l]]+s[i];//队首一定是最优选择
}
int num=neInf;
for (int i=;i<=n;i++) num=max(num,f[i]);
if (num>=k) return ;
else return ;
}
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const long long neInf=0x8080808080808080;
int f[],n,d,k;
int q[];
int x[],s[],sum,aleft,aright,ans;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
bool check(int g)
{
memset(q,,sizeof(q));
memset(f,0x80,sizeof(f));f[]=;
int l=,r=,j=;
int L=d-g,R=d+g;
if (L<) L=;
for (int i=;i<=n;i++)
{
while(x[i]-x[j]>=L&&j<i)
{
if (f[j]!=neInf)
{
while(l<=r&&f[q[r]]<=f[j]) r--;
q[++r]=j;
}
j++;
}
while(l<=r&&x[i]-x[q[l]]>R) l++;
if (l<=r) f[i]=f[q[l]]+s[i];
}
int num=neInf;
for (int i=;i<=n;i++) num=max(num,f[i]);
if (num>=k) return ;
else return ;
}
signed main()
{
n=read(),d=read(),k=read();
for (int i=;i<=n;i++)
{
x[i]=read(),s[i]=read();
if (s[i]>) sum+=s[i];
}
aright=max(x[n],d);
if (sum<k){
cout<<-;
return ;
}
while(aleft<=aright)
{
int mid=(aleft+aright)>>;
if (check(mid)) ans=mid,aright=mid-;
else aleft=mid+;
}
cout<<ans;
return ;
}
【NOIP2017】跳房子 题解(单调队列优化线性DP)的更多相关文章
- 洛谷luogu3957跳房子(单调队列优化)
QwQ被普及组的题折磨的死去活来. 硬是卡线段树,没卡过QwQ oi生涯,第一道正经的单调队列dp题 进入正题 题目大意: 其中\(n \le 500000\) 看到这个题的第一感觉就是二分金币数 很 ...
- poj1821 Fence【队列优化线性DP】
Fence Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6122 Accepted: 1972 Description ...
- 洛谷p1725 露琪诺 单调队列优化的DP
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int ...
- 单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
- bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401
这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...
- 【bzoj3831】[Poi2014]Little Bird 单调队列优化dp
原文地址:http://www.cnblogs.com/GXZlegend/p/6826475.html 题目描述 In the Byteotian Line Forest there are t ...
- BestCoder Round #89 02单调队列优化dp
1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01 HDU 5944 水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...
- [NOIP2017普及组]跳房子(二分,单调队列优化dp)
[NOIP2017普及组]跳房子 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 nn 个格子, ...
- P3957 跳房子(二分答案+单调队列优化DP)
题目链接:https://www.luogu.org/contestnew/show/4468 题目大意:跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则 ...
随机推荐
- SpringBoot集成MyBatis小记
SpringBoot集成MyBatis小记 参考MyBatis官网 1. 添加maven依赖 添加到pom.xml <dependency> <groupId>org.myba ...
- True Liars POJ - 1417
True Liars After having drifted about in a small boat for a couple of days, Akira Crusoe Maeda was f ...
- CSS实现宽度自适应100%,宽高16:9的比例的矩形
现在我们来讲讲做自适应16:9的矩形要怎么做 第一步先计算高度,假设宽100%,那么高为h=9/16=56.25% 第二步利用之前所说设置padding-bottom方法实现矩形 代码 HTML &l ...
- 理解js中的原型,原型对象,原型链
目录 理解原型 理解原型对象 实例属性与原型属性的关系 更简单的原型语法 原型的动态性 原型链 理解原型 我们创建的每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象, ...
- Python Ethical Hacking - Basic Concetion
What is Hacking? Gaining unauthorized access. Hackers? 1.Black-hat Hackers 2.White-hat Hackers 3.Gre ...
- 数据库分布式事务XA规范介绍及Mysql底层实现机制
1. 引言 分布式事务主要应用领域主要体现在数据库领域.微服务应用领域.微服务应用领域一般是柔性事务,不完全满足ACID特性,特别是I隔离性,比如说saga不满足隔离性,主要是通过根据分支事务执行成功 ...
- 惠普EX920强打760P驱动后无法开机,无法启动系统。
Windows10 1909与Intel 760P驱动版本不匹配的原因,造成了强打驱动后,无法启动系统的原因. 惠普EX920强打Intel 760P驱动教程:http://tieba.baidu.c ...
- Mybatis(二)简化Mybatis实现数据库操作
要操作的数据库: 一.与数据库对应的bean类 public class User { private String username; private String sex; private Str ...
- liunx安装和部署nacos配置中心
1.下载https://github.com/alibaba/nacos/releases nacos-server-1.3.1.tar.gz 源码包2.上传到liunx服务器 /usr/lo ...
- Python编程导论第2版|百度网盘免费下载|新手学习
点击下方即可免费下载 百度网盘免费下载:Python编程导论第2版 提取码:18g5 豆瓣评论: 介绍: 本书基于MIT 编程思维培训讲义写成,主要目标在于帮助读者掌握并熟练使用各种计算技术,具备用计 ...