51nod 1287加农炮
第1行:2个数M, N中间用空格分隔,分别为数组A和B的长度(1 <= m, n <= 50000)
第2至M + 1行:每行1个数,表示对应的地形高度(0 <= A[i] <= 1000000)。
第M + 2至N + M + 1行,每行1个数,表示炮弹的高度(0 <= B[i] <= 1000000)。
输出共M行,每行一个数,对应最终的地形高度。
9 11
1
2
0
4
3
2
1
5
7
2
8
0
7
6
5
3
4
5
6
5
2
2
2
4
3
3
5
6
7 思路:线段树+二分,利用线段树存储每一个区间内的山峰最高值,通过二分查找找出高度大于等于当前炮弹的山峰下标k,将k-1位置的山峰高度+1即可
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio> using namespace std;
//typedef long long LL;
const int maxn = ;
int a[maxn],rs[maxn<<];
int n,m;
void pushup(int rt){
rs[rt] = max(rs[rt<<],rs[rt<<|]);
}
void build(int l,int r,int rt)
{
if(l==r){
rs[rt] = a[l];
return;
}
int mid=(l+r)>>;
build(l,mid,rt<<);
build(mid+,r,rt<<|);
pushup(rt);
}
void update(int x,int l,int r,int rt)
{
if(l==r){
rs[rt]++;
return;
}
int mid=(l+r)>>;
if(x<=mid) update(x,l,mid,rt<<);
else update(x,mid+,r,rt<<|);
pushup(rt);
}
int query(int x,int l,int r,int rt)//根据x的值找出从左往右找出第一个能碰到的山峰的下标
{
if(l==r) return l;
int mid = (l+r)>>;
if(x<=rs[rt<<]) query(x,l,mid,rt<<);
else query(x,mid+,r,rt<<|);
}
int Query(int x,int l,int r,int rt)//根据点查询数据
{
if(l==r)return rs[rt];
int mid = (l+r)>>;
if(x<=mid)Query(x,l,mid,rt<<);
else Query(x,mid+,r,rt<<|);
}
int main()
{
ios::sync_with_stdio(false);
// freopen("in.txt","r",stdin);
while(cin>>n>>m){
int x;
memset(rs,,sizeof(rs));
for(int i=;i<=n;i++)
cin>>a[i];
build(,n,);
for(int i=;i<=m;i++){
cin>>x;
// if(x>rs[1]||x<=a[1])continue;一开始在这里卡了好久 后头想起来第一个位置的高度可能也会更新所以每一次都需要查询
if(x>rs[]||x<=Query(,,n,))continue;
int k=query(x,,n,);
update(k-,,n,);//更新前一个点的高度
}
for(int i=;i<=n;i++)
cout<<Query(i,,n,)<<endl;
}
return ;
}
51nod 1287加农炮的更多相关文章
- 51Nod 1287 加农炮 (线段树)
1287 加农炮 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个长度为M的正整数数组A,表示从左向右的地形高度 ...
- 51nod 1287: 加农炮 好题啊好题
1287 加农炮 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个长度为M的正整数数组A,表示从左向右的地形高度. ...
- 51NOD 1287 加农炮(不水的线段树)
>>点击进入原题测试<< Input示例 Output示例 思路:刚开始以为结点存最大值就行了,然后大于左子树的最大值就能进入右子树:然后发现样例都过不了:后面发现,并不是这个 ...
- 51 Nod 1287 加农炮(单调队列思想+二分)
1287 加农炮 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个长度为M的正整数数组A,表示从左向右的地形高度 ...
- 51nod 1287 线段树
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287 简单的线段树题目,直接写个二分查找大于等于x的最小位置就好了. # ...
- 解题报告:51nod 加农炮
2017-10-07 16:15:16 writer:pprp 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 一个长度为M的正整 ...
- 51nod加农炮
这道题维护一下前缀最大值然后二分答案就好了哇 233 #include<cstdio> #include<cstring> #include<algorithm> ...
- 【51Nod 1244】莫比乌斯函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...
- 51Nod 1268 和为K的组合
51Nod 1268 和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...
随机推荐
- JS原生实现五角星评价详情demo
<style> *{margin: 0;padding: 0;} .pingfen{ width: 195px; margin:10px auto; height:20px; positi ...
- Android中View的layout mechanism(布局机制)
layout mechanism Android中View的layout mechanism主要分为两个阶段:measure阶段和layout阶段.layout mechanism按照一定的顺序进行, ...
- Leetcode812.Largest Triangle Area最大三角形面积
给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积. 示例: 输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] 输出: 2 解释: 这 ...
- ActivityManagerService
先上类图: 基本类说明和运行框架图中蓝色表示AMS进程,黄色表示app进程.1. 全局调度者在android中,AMS是activity和进程的全局调度者,也就是说系统中载入和准备载入的activit ...
- AtCoder Regular Contest 085 C HSI【概率论】
AtCoder Regular Contest 085 C HSI 没学概率论还不怎么看得懂,虽然感觉不难,其实明明可以猜出来的..... 参考博客:https://www.cnblogs.com/g ...
- eclipse Some projects cannot be imported because they already exist in the workspace
archive file 档案文件 删除对应的文件即可
- iPhone 7 Plus 维修记 (一)(2019-08-07)
iPhone 7 Plus 维修记 问题 电池鼓包,屏幕已经被撑起,偶尔死机突然关机. 分析 初步分析是电池损坏. 维修 由于电池没有双易拉条需要将后壳加热后再取出电池. 更换电池后测试,发现电量一会 ...
- 大话鸿蒙操作系统(一)-- 先聊聊 Fuchsia OS
大话鸿蒙操作系统(一) 第一篇先不聊鸿蒙操作系统,聊聊 Google 的新系统 Fuchsia OS. 先看看 Fuchsia OS 介绍. 为什么 Google 要造新的 Fuchsia OS 操作 ...
- TCP之传输对象 客户端传输user对象到服务端 验证登录是否合法
Server.java package com.sxt.tcp4; import java.io.IOException; import java.io.ObjectInputStream; impo ...
- 云原生生态周报 Vol. 2
摘要: Cloud Native Weekly China Vol. 2 业界要闻 Kubernetes External Secrets 近日,世界上最大的域名托管公司 Godaddy公司,正式宣布 ...