博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LUOGU] P3957 跳房子
阅读量:6151 次
发布时间:2019-06-21

本文共 1210 字,大约阅读时间需要 4 分钟。

很考验代码能力的一道题..各种边界

思路是二分答案+DP验证,DP式具有显然的单调性

#include
#include
#include
#include
#include
using namespace std;inline int rd(){ int ret=0,f=1;char c; while(c=getchar(),!isdigit(c))f=c=='-'?-1:1; while(isdigit(c))ret=ret*10+c-'0',c=getchar(); return ret*f;}#define space() putchar(' ')#define nextline() putchar('\n')void pot(int x){if(!x)return;pot(x/10);putchar('0'+x%10);}void out(int x){if(!x)putchar('0');if(x<0)putchar('-'),x=-x;pot(x);}const int MAXN = 500005;int n,d,aim;int dis[MAXN],val[MAXN];int f[MAXN];int q[MAXN];bool check(int x){ int l=1,r=0; memset(f,0,sizeof(f)); memset(q,0,sizeof(q)); f[0]=0; int kl=max(1,d-x),kr=d+x; int j=0; for(int i=1;i<=n;i++){ while(j
<=dis[i]){ while(l<=r&&f[q[r]]<=f[j]) r--; if(f[j]==-(1<<30)){j++;continue;} q[++r]=j++; } while(l<=r&&dis[q[l]]+kr
=aim) return 1; } return 0;}int main(){ n=rd();d=rd();aim=rd(); for(int i=1;i<=n;i++)dis[i]=rd(),val[i]=rd(); int l=0,r=1e9,mid,ans=-1; while(l<=r){ mid=(l+r)>>1; if(check(mid)) r=mid-1,ans=mid; else l=mid+1; } out(ans); return 0;}

转载于:https://www.cnblogs.com/ghostcai/p/9868885.html

你可能感兴趣的文章
SQL Server表分区详解
查看>>
使用FMDB最新v2.3版本教程
查看>>
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
淘宝的几个架构图
查看>>
linux后台运行程序
查看>>
Python异步IO --- 轻松管理10k+并发连接
查看>>
Oracle中drop user和drop user cascade的区别
查看>>
登记申请汇总
查看>>
Android Jni调用浅述
查看>>
CodeCombat森林关卡Python代码
查看>>
第一个应用程序HelloWorld
查看>>
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Java并发编程73道面试题及答案
查看>>
企业级负载平衡简介(转)
查看>>
Shell基础之-正则表达式
查看>>
JavaScript异步之Generator、async、await
查看>>
讲讲吸顶效果与react-sticky
查看>>
c++面向对象的一些问题1 0
查看>>
售前工程师的成长---一个老员工的经验之谈
查看>>