1287 加农炮

1287 加农炮

一个长度为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行: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)。

Output

输出共M行,每行一个数,对应最终的地形高度。

Input示例

9 11
1
2
0
4
3
2
1
5
7
2
8
0
7
6
5
3
4
5
6
5

Output示例

2
2
2
4
3
3
5
6
7

思路:我们用线段树,如果该区间有比炮弹高度大的,那么我们先去看左区间最大值,没有再去右区间
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 int n,m;
 5 int a[50004],x;
 6 int b[50004];
 7
 8 struct node{
 9     int l,r,mx;
10 }c[50004*4];
11
12 void build(int x,int L,int R){
13     c[x].l=L;
14     c[x].r=R;
15     int mid=(L+R)>>1;
16     if(L==R){
17         c[x].mx=a[L];return ;
18     }
19     build(2*x,L,mid);build(2*x+1,mid+1,R);
20     c[x].mx=max(c[2*x].mx,c[2*x+1].mx);
21 }
22
23 int query(int x,int xx){
24    if(c[x].l==c[x].r){
25         if(c[x].mx>=xx) return c[x].l-1;
26    }
27 //   cout<<c[2*x].mx<<" "<<c[2*x+1].mx<<endl;
28    if(c[2*x].mx>=xx) query(2*x,xx);
29    else if(c[2*x+1].mx>=xx) query(2*x+1,xx);
30    else return 0;
31 }
32
33 void update(int x,int xx){
34     if(c[x].l==xx&&c[x].r==xx){
35
36         c[x].mx++;return ;
37     }
38     int mid=(c[x].l+c[x].r)>>1;
39
40     if(xx<=mid) update(2*x,xx);
41     else update(2*x+1,xx);
42     c[x].mx=max(c[2*x].mx,c[2*x+1].mx);
43 }
44
45 void hh(int x){
46     if(c[x].l==c[x].r){
47         b[c[x].l]=c[x].mx;return ;
48     }
49     hh(x*2);hh(2*x+1);
50 }
51 int main(){
52     scanf("%d%d",&n,&m);
53     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
54     build(1,1,n);
55     for(int i=1;i<=m;i++){
56         scanf("%d",&x);
57         int y=query(1,x);
58
59         if(y!=0)
60         update(1,y);
61     }
62     hh(1);
63     for(int i=1;i<=n;i++) printf("%d\n",b[i]);
64 }
时间: 2025-01-16 22:50:27

1287 加农炮的相关文章

51nod 1287 加农炮(锻炼思维的好题)

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287 一个长度为M的正整数数组A,表示从左向右的地形高度.测试一种加农炮,炮弹平行于地面从左向右飞行,高度为H,如果某处地形的高度大于等于炮弹飞行的高度H(A[i] >= H),炮弹会被挡住并落在i - 1处,则A[i - 1] + 1.如果H <= A[0],则这个炮弹无效,如果H > 所有的A[i],这个炮弹也无效.现在给定N个整数的数组B代表炮弹高度

ZOJ1372 POJ 1287 Networking 网络设计 Kruskal算法

题目链接:ZOJ1372 POJ 1287 Networking 网络设计 Networking Time Limit: 2 Seconds      Memory Limit: 65536 KB You are assigned to design network connections between certain points in a wide area. You are given a set of points in the area, and a set of possible

POJ - 1287 Networking

题目链接:http://poj.org/problem?id=1287 Sample Input 1 0 2 3 1 2 37 2 1 17 1 2 68 3 7 1 2 19 2 3 11 3 1 7 1 3 5 2 3 89 3 1 91 1 2 32 5 7 1 2 5 2 3 7 2 4 8 4 5 11 3 5 10 1 5 6 4 2 12 0 Sample Output 0 17 16 26 分析:最小生成树纯模板 1 #include <cstdio> 2 #include &

rwkj 1287 球的体积

C语言:顺序结构3(球的体积)时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte总提交:880 测试通过:610 描述 编写程序,输入球到半径,计算并输出球的体积.圆周率取3.14159. 输入 球到半径. 输出 球的体积.注意:保留3位小数,输出后换行. 样例输入 10 样例输出 4188.787 #include<stdio.h>#define PI 3.14159void main(){ int r; float x; scanf("%d

51nod 1287 线段树

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287 简单的线段树题目,直接写个二分查找大于等于x的最小位置就好了. 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define inf 0x3f3f3f3f 4 #define LL long long 5 const int MAX=50005; 6 int A[MAX]; 7 struct SegTree

(最小生成树) Networking -- POJ -- 1287

链接: http://poj.org/problem?id=1287 代码: #include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> using namespace std; const int N = 210; const int INF = 0xfffffff; int n; int J[N][N], dist

POJ 1287 Networking (最小生成树)

Networking Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1287 Appoint description:  System Crawler  (2015-06-02) Description You are assigned to design network connections between certain poin

mysql中,ENCODE警告---Warning Code : 1287

mysql中,ENCODE警告 共 1 行受到影响, 1 个警告 执行耗时 : 0.072 sec传送时间 : 0.001 sec总耗时 : 0.073 sec Warning Code : 1287'ENCODE' is deprecated and will be removed in a future release. Please use AES_ENCRYPT instead

矩阵乘法 codevs 1287 矩阵乘法

1287 矩阵乘法 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容.当然,小明上课打瞌睡也没问题,但线性代数的习题可是很可怕的.小明希望你来帮他完成这个任务. 现在给你一个ai行aj列的矩阵和一个bi行bj列的矩阵,要你求出他们相乘的积(当然也是矩阵).(输入数据保证aj=bi,不需要判断) 矩阵乘法的定义: 1. 矩阵A乘以B的