【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 题目大意:跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则 ...
随机推荐
- Yii2源码分析(一):入口
写在前面,写这些随笔是记录下自己看Yii2源码的过程,可能会有些流水账,大部分解析放在注释里说明,由于个人水平有限,有不正确的地方还望斧正. web入口文件Index.php // 定义全局的常量,Y ...
- 2020年Java基础高频面试题汇总(1.4W字详细解析,你能遇到的都在这了)
1. Java语言有哪些特点 (1)简单易学.有丰富的类库 (2)面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高) (3)与平台无关性(JVM是Java跨平台使用的根本) (4)可靠安全 ...
- Python爬虫:手把手教你写迷你爬虫架构
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:我爱学Python 语言&环境 语言:继续用Python开路 ...
- Django框架12 /同源、跨域、CORS
Django框架12 /同源.跨域.CORS 目录 Django框架12 /同源.跨域.CORS 1. 同源策略 2. 跨域 3. 解决跨域:CORS/跨域资源共享 1. 同源策略 同源策略(Same ...
- Lua-源码-字符串的resize函数-luaS_resize
// 这里需要问一下:upval和一般的对象有什么区别?为什么要单独一个函数来处理? void luaC_linkupval (lua_State *L, UpVal *uv) { global_St ...
- 《串并行数据结构与算法(SML语言)实验》题解
注意:本题解仅供参考学习,请勿直接抄袭代码,否则造成的后果和笔者无关. 第一题: 题意: 对n个数升序排序. 题解: 快排,不解释. 代码(省略了输入输出函数,下同): val n = getInt ...
- Ethical Hacking - GAINING ACCESS(17)
CLIENT SIDE ATTACKS - Backdooring exe' s Download an executable file first. VEIL - FRAMEWORK A backd ...
- 设计模式:bridge模式
目的:将“类的功能层次结构”和“类的实现层次结构”分类 类的功能层次:通过类的继承添加功能(添加普通函数) 类的实现层次:通过类的继承实现虚函数 理解:和适配器模式中的桥接方法相同 例子: class ...
- Linux/Docker 中使用 System.Drawing.Common 踩坑小计
前言 在项目迁移到 .net core 上面后,我们可以使用 System.Drawing.Common 组件来操作 Image,Bitmap 类型,实现生成验证码.二维码,图片操作等功能.Syste ...
- selenium自动爬取网易易盾的验证码
我们在爬虫过程中难免会遇到一些拦路虎,比如各种各样的验证码,时不时蹦出来,这时候我们需要去识别它来继续我们的工作,接下来我将爬取网一些滑动验证码,然后通过百度的EasyDL平台进行数据标注,创建模型, ...