51nod1287 加农炮(线段树)
来源:互联网 发布:linux凝思重启网卡命令 编辑:程序博客网 时间:2024/05/16 11:20
/*线段树*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn=5e4+5;int n,m;int a[maxn];struct node{ int left,right; int h;}tree[maxn<<2];void push_up(int i){ tree[i].h=max(tree[i<<1].h,tree[i<<1|1].h);}void build(int i,int L,int R){ tree[i].left=L; tree[i].right=R; if(L==R) { tree[i].h=a[L]; return ; } int mid=(tree[i].left+tree[i].right)>>1; build(i<<1,L,mid); build(i<<1|1,mid+1,R); push_up(i);}int search_pos(int i,int height){ if(tree[i].left==tree[i].right) { return tree[i].left; } int mid=(tree[i].left+tree[i].right)>>1; if(height<=tree[i<<1].h) search_pos(i<<1,height); else search_pos(i<<1|1,height);}void update(int i,int ql,int qr){ if(tree[i].left==tree[i].right) { tree[i].h++; return ; } int mid=(tree[i].left+tree[i].right)>>1; if(qr<=mid) update(i<<1,ql,qr); else update(i<<1|1,ql,qr); push_up(i);}int main(){ while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } build(1,1,n); int b; for(int i=1;i<=m;i++) { scanf("%d",&b); if(b<=a[1]||b>tree[1].h) continue; int idx=search_pos(1,b); a[idx-1]++; update(1,1,idx-1); } for(int i=1;i<=n;i++) { printf("%d\n",a[i]); } } return 0;}
/*预处理预处理每个炮弹轰炸位置,然后对于每次轰炸更新位置信息*/#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=5e4+5;const int maxm=1e6+5;int n,m;int a[maxn],b[maxn];int pos[maxm];//注意高度范围int main(){ while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } int maxh=0;//最大高度 for(int i=1;i<=m;i++) { scanf("%d",&b[i]); maxh=max(b[i],maxh); } int p=1; memset(pos,0,sizeof(pos)); for(int i=1;i<=maxh;i++)//预处理轰炸位置 { while(p<=n&&a[p]<i) { p++; } pos[i]=p-1; } for(int i=1;i<=m;i++)//每个炸弹进行轰炸 { p=pos[b[i]]; if(p==0||p==n) continue; a[p]++; pos[a[p]]=min(pos[a[p]],p-1);//更新位置信息 } for(int i=1;i<=n;i++) { printf("%d\n",a[i]); } } return 0;}
阅读全文
0 0
- 51nod1287 加农炮(线段树)
- 51NOD1287 加农炮(线段树)
- 51nod1287 加农炮 线段树
- 51NOD1287 加农炮 【RMQ】
- 51nod1287【线段树+折半搜索】
- 51nod1287 加农炮 构造顺序序列 二分查找
- 51nod:加农炮(线段树+单调性)
- 51nod 1287 加农炮(二分/线段树)
- 51nod 1287 加农炮 【线段树】
- 51Nod 1287 加农炮 ( 暴力/线段树
- 51nod 1287加农炮【线段树*好题】
- 51Nod 1287 加农炮 (线段数单点更新单点查询)
- 51nod 1287 加农炮(分块)
- 51nod-1287 加农炮
- 51nod 1287 加农炮
- 【51Nod】1287 加农炮
- 51nod-加农炮
- 51Nod 加农炮
- CCF考试练习——201612-1
- 从瓶颈到精通——Android四大组件:Activity
- pl/sql重复记录处理
- STL算法(1) C++ 查找算法
- BuildAsset-场景测试
- 51nod1287 加农炮(线段树)
- HDU 1576 A/B 扩展欧几里得
- mysql5.6.30安装部署(mysql+keeplived)
- arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别
- oracle事务处理详解
- 51Nod 1116 K进制下的大数【数学】
- Java 方法
- Dijkstra算法,求最短路(dp 动态规划)
- Qt5开发学习之图形视图框架(九)