A
来源:互联网 发布:vb 字符串 校验码 编辑:程序博客网 时间:2024/05/31 19:26
A - 加农炮
一个长度为M的正整数数组A,表示从左向右的地形高度。测试一种加农炮,炮弹平行于地面从左向右飞行,高度为H,如果某处地形的高度大于等于炮弹飞行的高度H(A
,这个炮弹也无效。现在给定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}。
第2至M + 1行:每行1个数,表示对应的地形高度(0 <= A
第M + 2至N + M + 1行,每行1个数,表示炮弹的高度(0 <= B
9 1112043215728076534565
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;}
阅读全文
0 0