码迷,mamicode.com
首页 > 其他好文 > 详细

【51NOD1287】加农炮

时间:2018-10-17 20:04:48      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:str   clu   fine   struct   for   修改   c++   line   分析   

题面

一个长度为M的正整数数组A,表示从左向右的地形高度。测试一种加农炮,炮弹平行于地面从左向右飞行,高度为H,如果某处地形的高度大于等于炮弹飞行的高度H(Ai >= H),炮弹会被挡住并落在i - 1处,则Ai−1 + 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}。
1 <= m, n <= 50000 0 <= Ai <= 1000000 0 <= Bi <= 1000000

分析

依次加入每个炮弹,线段树维护最大值,每次找出第一个高度大于等于当前炮弹飞行高度的位置,修改此位置前一个位置的高度。
感觉是个模拟..

代码

#include<bits/stdc++.h>
using namespace std;
#define N 50050
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (t[p].l+t[p].r>>1)
int n,m,x,k;
int a[N];
struct email
{
    int l,r,maxx;
}t[N*4];

inline void pushup(int p)
{
    t[p].maxx=max(t[lc].maxx,t[rc].maxx);
}

inline void build(int p,int l,int r)
{
    t[p].l=l;t[p].r=r;
    if(l==r)
    {
        t[p].maxx=a[l];
        return ;
    }
    int bm=l+r>>1;
    build(lc,l,bm);build(rc,bm+1,r);
    pushup(p);
}

inline void update(int p,int x)
{
    if(t[p].l==t[p].r)
    {
        t[p].maxx=a[x];
        return ;
    }
    if(x<=mid)update(lc,x);
    if(x>mid)update(rc,x);
    pushup(p);
}

inline int query(int p,int x)
{
    if(t[p].l==t[p].r)return t[p].l;
    if(x<=t[lc].maxx)return query(lc,x);
    if(x>t[lc].maxx)return query(rc,x);
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&x);
        if(x<=a[1]||x>t[1].maxx)continue;
        k=query(1,x);a[k-1]++;update(1,k-1);
    }
    for(int i=1;i<=n;i++)
        printf("%d\n",a[i]);
    return 0;
}

 

【51NOD1287】加农炮

标签:str   clu   fine   struct   for   修改   c++   line   分析   

原文地址:https://www.cnblogs.com/NSD-email0820/p/9806373.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!