A

来源:互联网 发布:vb 字符串 校验码 编辑:程序博客网 时间:2024/05/31 19:26

A - 加农炮

一个长度为M的正整数数组A,表示从左向右的地形高度。测试一种加农炮,炮弹平行于地面从左向右飞行,高度为H,如果某处地形的高度大于等于炮弹飞行的高度H(Ai >= H),炮弹会被挡住并落在i - 1处,则Ai1 + 1。如果H <= A0,则这个炮弹无效,如果H > 所有的Ai

,这个炮弹也无效。现在给定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 <= Ai <= 1000000)。
第M + 2至N + M + 1行,每行1个数,表示炮弹的高度(0 <= Bi
<= 1000000)。
Output
输出共M行,每行一个数,对应最终的地形高度。
Sample Input
9 1112043215728076534565
Sample Output
222433567


代码 :

#include<iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<queue>using namespace std;#define maxn 50005struct node{    int l;    int r;    int val;}tree[maxn*4];int dixing[1000005];int n,m;int t;void build(int k,int l,int r){   tree[k].l=l;   tree[k].r=r;   if(l==r)   {       tree[k].val=dixing[tree[k].l];       return;   }   int mid=(l+r)/2;   build(k<<1,l,mid);   build(k<<1|1,mid+1,r);   tree[k].val=max(tree[k<<1].val,tree[k<<1|1].val);}void tttt(int k,int hh){   if(tree[k].l==hh&&tree[k].r==hh)   {   tree[k].val++;   return;   }   if(hh<=tree[k*2].r)   tttt(k*2,hh);   else    tttt(k*2+1,hh);   tree[k].val=max(tree[k<<1].val,tree[k<<1|1].val);}void update(int k,int pos){if(pos<=dixing[1])return;if(pos>tree[1].val)return;//&&pos<=tree[1].val&&pos>dixing[1]if(tree[k].l==tree[k].r&&tree[k].val>=pos){tttt(1,tree[k].l-1);dixing[tree[k].l-1]++;return;}if(tree[k<<1].val>=pos)update(k<<1,pos);else update(k<<1|1,pos);tree[k].val=max(tree[k<<1].val,tree[k<<1|1].val);}int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)    scanf("%d",&dixing[i]);    build(1,1,n);    int a;    for(int i=1;i<=m;i++)    {    scanf("%d",&a);    update(1,a);    }    for(int i=1;i<=n;i++)    printf("%d\n",dixing[i]);return 0;}