题目来源: Codility
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
一个长度为M的正整数数组A,表示从左向右的地形高度。测试一种加农炮,炮弹平行于地面从左向右飞行,高度为H,如果某处地形的高度大于等于炮弹飞行的高度H(A[i] >= H),炮弹会被挡住并落在i - 1处,则A[i - 1] + 1。如果H <= A[0],则这个炮弹无效,如果H > 所有的A[i],这个炮弹也无效。现在给定N个整数的数组B代表炮弹高度,计算出最后地形的样子。
例如:地形高度A = {1, 2, 0, 4, 3, 2, 1, 5, 7}, 炮弹高度B = {2, 8, 0, 7, 6, 5, 3, 4, 5, 6, 5},最终得到的地形高度为:{2, 2, 2, 4, 3, 3, 5, 6, 7}。
Input
  1. 1行:2个数M, N中间用空格分隔,分别为数组AB的长度(1 <= m, n <= 50000)
  2. 2+ 1行:每行1个数,表示对应的地形高度(0 <= A[i] <= 1000000)。
  3. + 2+ M + 1行,每行1个数,表示炮弹的高度(0 <= B[i] <= 1000000)。
Output
  1. 输出共M行,每行一个数,对应最终的地形高度。
Input示例
  1. 9 11
  2. 1
  3. 2
  4. 0
  5. 4
  6. 3
  7. 2
  8. 1
  9. 5
  10. 7
  11. 2
  12. 8
  13. 0
  14. 7
  15. 6
  16. 5
  17. 3
  18. 4
  19. 5
  20. 6
  21. 5
Output示例
  1. 2
  2. 2
  3. 2
  4. 4
  5. 3
  6. 3
  7. 5
  8. 6
  9. 7
  10.  
  11. 思路:线段树+二分,利用线段树存储每一个区间内的山峰最高值,通过二分查找找出高度大于等于当前炮弹的山峰下标k,将k-1位置的山峰高度+1即可
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<cstdio>
  5.  
  6. using namespace std;
  7. //typedef long long LL;
  8. const int maxn = ;
  9. int a[maxn],rs[maxn<<];
  10. int n,m;
  11. void pushup(int rt){
  12. rs[rt] = max(rs[rt<<],rs[rt<<|]);
  13. }
  14. void build(int l,int r,int rt)
  15. {
  16. if(l==r){
  17. rs[rt] = a[l];
  18. return;
  19. }
  20. int mid=(l+r)>>;
  21. build(l,mid,rt<<);
  22. build(mid+,r,rt<<|);
  23. pushup(rt);
  24. }
  25. void update(int x,int l,int r,int rt)
  26. {
  27. if(l==r){
  28. rs[rt]++;
  29. return;
  30. }
  31. int mid=(l+r)>>;
  32. if(x<=mid) update(x,l,mid,rt<<);
  33. else update(x,mid+,r,rt<<|);
  34. pushup(rt);
  35. }
  36. int query(int x,int l,int r,int rt)//根据x的值找出从左往右找出第一个能碰到的山峰的下标
  37. {
  38. if(l==r) return l;
  39. int mid = (l+r)>>;
  40. if(x<=rs[rt<<]) query(x,l,mid,rt<<);
  41. else query(x,mid+,r,rt<<|);
  42. }
  43. int Query(int x,int l,int r,int rt)//根据点查询数据
  44. {
  45. if(l==r)return rs[rt];
  46. int mid = (l+r)>>;
  47. if(x<=mid)Query(x,l,mid,rt<<);
  48. else Query(x,mid+,r,rt<<|);
  49. }
  50. int main()
  51. {
  52. ios::sync_with_stdio(false);
  53. // freopen("in.txt","r",stdin);
  54. while(cin>>n>>m){
  55. int x;
  56. memset(rs,,sizeof(rs));
  57. for(int i=;i<=n;i++)
  58. cin>>a[i];
  59. build(,n,);
  60. for(int i=;i<=m;i++){
  61. cin>>x;
  62. // if(x>rs[1]||x<=a[1])continue;一开始在这里卡了好久 后头想起来第一个位置的高度可能也会更新所以每一次都需要查询
  63. if(x>rs[]||x<=Query(,,n,))continue;
  64. int k=query(x,,n,);
  65. update(k-,,n,);//更新前一个点的高度
  66. }
  67. for(int i=;i<=n;i++)
  68. cout<<Query(i,,n,)<<endl;
  69. }
  70. return ;
  71. }

51nod 1287加农炮的更多相关文章

  1. 51Nod 1287 加农炮 (线段树)

    1287 加农炮  题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 一个长度为M的正整数数组A,表示从左向右的地形高度 ...

  2. 51nod 1287: 加农炮 好题啊好题

    1287 加农炮 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 一个长度为M的正整数数组A,表示从左向右的地形高度. ...

  3. 51NOD 1287 加农炮(不水的线段树)

    >>点击进入原题测试<< Input示例 Output示例 思路:刚开始以为结点存最大值就行了,然后大于左子树的最大值就能进入右子树:然后发现样例都过不了:后面发现,并不是这个 ...

  4. 51 Nod 1287 加农炮(单调队列思想+二分)

    1287 加农炮  题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 一个长度为M的正整数数组A,表示从左向右的地形高度 ...

  5. 51nod 1287 线段树

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287 简单的线段树题目,直接写个二分查找大于等于x的最小位置就好了. # ...

  6. 解题报告:51nod 加农炮

    2017-10-07 16:15:16 writer:pprp 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题   一个长度为M的正整 ...

  7. 51nod加农炮

    这道题维护一下前缀最大值然后二分答案就好了哇 233 #include<cstdio> #include<cstring> #include<algorithm> ...

  8. 【51Nod 1244】莫比乌斯函数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...

  9. 51Nod 1268 和为K的组合

    51Nod  1268  和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...

随机推荐

  1. @codechef - KILLER@ Painting Tree

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 N 个点的有根树,标号 1 到 N,以 1 为根.定义 ...

  2. Django Rest Framework Serializer的简单使用

    1.RESTful 1.1 定义 REST(Representational State Transfer)与技术无关,代表一种软件架构风格,中文为表征状态转移. 1.2 RESTful API设计 ...

  3. python 解释器编码

  4. 网络编程--多线程 , socketserver

    内容补充 python2与python3的区别? """ python3对unicode字符的原生支持 Python2中使用ASCII码作为默认编码方式导致string有 ...

  5. 如何在WPF控件上应用简单的褪色透明效果?

    原文 https://dailydotnettips.com/how-to-create-simple-faded-transparent-controls-in-wpf/ 使用OpacityMask ...

  6. TCP之单项通信

    TestServer.java package com.sxt.tcp; /* * 服务端 */ import java.io.DataInputStream; import java.io.IOEx ...

  7. 基于Qt框架的GUI控制台——qtconsole

  8. IoT SaaS加速器——助力阿尔茨海默病人护理

    场景介绍 阿尔茨海默病,是导致中老年人认知功能障碍的最常见疾病之一,是发生在老年期及老年前期的一种原发性退行性脑病.据估计,全世界痴呆症患者数量为4700万,到2030年将达到7500万人.痴呆症患者 ...

  9. Flask学习之十三 日期和时间

    英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xiii-dates-and-times 中文翻译地址: ...

  10. Vue.js 第2章 钩子函数&自定义指令&过滤器&计算属性&侦听器

    目标 钩子函数 自定义指令 自定义过滤器 计算属性 监听属性 局部自定义指令 为什么需要自定义指令 为了复用,为了代码的灵活 指令的分类:全局指令,局部指令 在vm外面创建的指令 通过Vue.dire ...