题目大意:给定一个数轴和 N 个点,点有点权,现从 0 位置出发,初始时每次只能走 d 的距离,可以在数轴上任意位置停下,此时,会得到一个点权和。现允许支付 x 的费用,使得每次可以走的距离为一个范围 [max(1,d-x), d+x]。求最少支付多少费用才能使得经过的点权和至少为 k。

题解:根据本题的数据范围可知,需要一个一维的状态和 O(1) 时间内的状态转移。

发现若支付 X 的代价可以满足点权和至少为 K,那么支付更多的代价一定可以满足条件。因此,考虑二分答案,对于每次二分的代价,进行 dp,根据最优解进行判断,是否存在经过一个点时的点权和满足条件。

在 dp 转移时,注意到是连续区间最值的转移方式,因此考虑单调队列。首先,判断有哪些新的状态可以转移到当前状态,将新的状态入队;其次,判断哪些在队内的状态不合法,将其弹出队列;最后进行合法的转移即可。

代码如下

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=5e5+10;
  4. typedef long long LL;
  5. LL f[maxn];
  6. int n,d,k,pos[maxn],s[maxn];
  7. bool check(int g){
  8. static int q[maxn];
  9. int l=1,r=0,now=0;
  10. for(int i=1;i<=n;i++)f[i]=-1e15;
  11. for(int i=1;i<=n;i++){
  12. while(now<i&&pos[i]-pos[now]>=d-g){
  13. while(l<=r&&f[now]>=f[q[r]])--r;
  14. q[++r]=now++;
  15. }
  16. while(l<=r&&pos[i]-pos[q[l]]>d+g)++l;
  17. if(l<=r)f[i]=f[q[l]]+s[i];
  18. }
  19. for(int i=1;i<=n;i++)if(f[i]>=k)return 1;
  20. return 0;
  21. }
  22. int main(){
  23. scanf("%d%d%d",&n,&d,&k);
  24. LL sum=0;
  25. for(int i=1;i<=n;i++){
  26. scanf("%d%d",&pos[i],&s[i]);
  27. if(s[i]>=0)sum+=s[i];
  28. }
  29. if(sum<k)return puts("-1"),0;
  30. int l=0,r=1e9;
  31. while(l<r){
  32. int mid=l+r>>1;
  33. if(check(mid))r=mid;
  34. else l=mid+1;
  35. }
  36. printf("%d\n",l);
  37. return 0;
  38. }

【洛谷P3957】跳房子的更多相关文章

  1. 洛谷P3957 跳房子(Noip2017普及组 T4)

    今天我们的考试就考到了这道题,在考场上就压根没有思路,我知道它是一道dp的题,但因为太弱还是写不出来. 下来评讲的时候知道了一些思路,是dp加上二分查找的方式,还能够用单调队列优化. 但看了网上的许多 ...

  2. 洛谷 P3957 跳房子

    https://www.luogu.org/problemnew/show/P3957 错误记录:1.没开longlong 2. -inf不够小 #include<cstdio> #inc ...

  3. 洛谷 P3957 跳房子 —— 二分答案+单调队列优化DP

    题目:https://www.luogu.org/problemnew/show/P3957 先二分一个 g,然后判断: 由于转移的范围是一个区间,也就是滑动窗口,所以单调队列优化: 可以先令队尾为 ...

  4. 洛谷P3957 跳房子 题解 二分答案/DP/RMQ

    题目链接:https://www.luogu.org/problem/P3957 这道题目我用到了如下算法: 线段树求区间最大值: 二分答案: DP求每一次枚举答案g时是否能够找到 \(\ge k\) ...

  5. 洛谷P3957 跳房子

    普及组的题.....填坑来了. 当年的我一眼二分+DP,现在都佩服起自己来了...... 然后我们就写个二分,在check里面写单调队列优化DP即可. 然后就A了...... #include < ...

  6. 2018.09.26洛谷P3957 跳房子(二分+单调队列优化dp)

    传送门 表示去年考普及组的时候失了智,现在看来并不是很难啊. 直接二分答案然后单调队列优化dp检验就行了. 注意入队和出队的条件. 代码: #include<bits/stdc++.h> ...

  7. 洛谷P3957:跳房子——题解

    https://www.luogu.org/problem/P3957 沉迷普及组题无法自拔. 显然二分答案,然后里面套个dp,$f[i]$表示跳到第$i$个格子的最大得分,复杂度$O(n^2logn ...

  8. 洛谷P3975 跳房子 [DP,单调队列优化,二分答案]

    题目传送门 跳房子 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一 ...

  9. 洛谷luogu3957跳房子(单调队列优化)

    QwQ被普及组的题折磨的死去活来. 硬是卡线段树,没卡过QwQ oi生涯,第一道正经的单调队列dp题 进入正题 题目大意: 其中\(n \le 500000\) 看到这个题的第一感觉就是二分金币数 很 ...

随机推荐

  1. jmeter性能测试总结

    一.性能测试问题记录: Ⅰ.秒杀的失败率了在96.45%,原因 Query对于 活动的秒杀采用的是0.5秒,刷新缓存的策略在活动中优惠券被秒杀一空 下架前,短暂的时间内仍能够查询到 这个活动架构中采用 ...

  2. 旗舰版win7系统中GraphEdit执行Loading a Graph From an External Process失败对策

    操作系统:旗舰版win7 DirectShow SDK: 9.0 IDE环境:VS2008 以下代码参考MSDN: HRESULT AddToRot(IUnknown *pUnkGraph, DWOR ...

  3. Java小技巧:怎么循环日期?

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try{//起始日期Date start = sdf.parse ...

  4. ssl安全验证

    #ssl验证 r=requests.get('https://www.12306.cn',verify=False) print(r.content.decode('utf-8')) 结果:

  5. 什么是云服务器ECS

    云服务器(Elastic Compute Service,简称ECS)是阿里云提供的性能卓越.稳定可靠.弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务.云服 ...

  6. Postgresql 监控sql之 pg_stat_statements模块

    postgresql.confpg_stat_statements.max = 1000000pg_stat_statements.track = allpg_stat_statements.trac ...

  7. 多模块环境下修改包名Rename directory与Rename package

    选中包名->右键Refactor->Rename,如果会弹出的警告框让选择Rename directory和Rename package时,若选择Rename directory,则是只修 ...

  8. 最短meeting路线(树的直径)--牛客第四场(meeting)

    题意: 给你一棵树,树上有些点是有人的,问你选一个点,最短的(最远的那个人的距离)是多少. 思路: 其实就是树的直径,两遍dfs,dfs第二遍的时候遇到人就更新直径就行了,ans是/2,奇数的话+1. ...

  9. MySQL中的SQL的常见优化策略

    MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 1 避免全表扫描对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 ...

  10. Java Web开发技术教程入门-数据库

    补更:阅战阅勇第六天 今天阅读了这本书的第六章-访问数据.首先,这本书讲解的是MySql数据库,它是一个关系型数据库管理系统,是由瑞典MySqlAB公司开发,目前属于Oracle旗下公司.在web应用 ...