Codeforces 272C Dima and Staircase【线段树】
来源:互联网 发布:数据分析r语言实战 编辑:程序博客网 时间:2024/05/22 02:00
Dima's got a staircase that consists of n stairs. The first stair is at height a1, the second one is at a2, the last one is at an(1 ≤ a1 ≤ a2 ≤ ... ≤ an).
Dima decided to play with the staircase, so he is throwing rectangular boxes at the staircase from above. The i-th box has width wi and height hi. Dima throws each box vertically down on the first wi stairs of the staircase, that is, the box covers stairs with numbers 1, 2, ..., wi. Each thrown box flies vertically down until at least one of the two following events happen:
- the bottom of the box touches the top of a stair;
- the bottom of the box touches the top of a box, thrown earlier.
We only consider touching of the horizontal sides of stairs and boxes, at that touching with the corners isn't taken into consideration. Specifically, that implies that a box with width wi cannot touch the stair number wi + 1.
You are given the description of the staircase and the sequence in which Dima threw the boxes at it. For each box, determine how high the bottom of the box after landing will be. Consider a box to fall after the previous one lands.
The first line contains integer n (1 ≤ n ≤ 105) — the number of stairs in the staircase. The second line contains a non-decreasing sequence, consisting of n integers, a1, a2, ..., an (1 ≤ ai ≤ 109; ai ≤ ai + 1).
The next line contains integer m (1 ≤ m ≤ 105) — the number of boxes. Each of the following m lines contains a pair of integers wi, hi(1 ≤ wi ≤ n; 1 ≤ hi ≤ 109) — the size of the i-th thrown box.
The numbers in the lines are separated by spaces.
Print m integers — for each box the height, where the bottom of the box will be after landing. Print the answers for the boxes in the order, in which the boxes are given in the input.
Please, do not use the %lld specifier to read or write 64-bit integers in C++. It is preferred to use the cin, cout streams or the %I64dspecifier.
51 2 3 6 641 13 11 14 3
1346
31 2 321 13 1
13
1151 21 101 101 101 10
13132333
The first sample are shown on the picture.
我们初始的时候有长度为N的一系列高度为a【i】的方块。
然后有Q个方块需要下落,下落的左端在位子1,每一次下落一个长度为wi,高度为hi的方块,问每一次这个方块下落到达的位子高度。
具体参考一下样例就懂了。
思路:
线段树区间更新,区间查询一下最大值即可。
Ac代码:
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;#define ll __int64ll a[150000];ll n;/***********************/#define lson l,m,rt*2#define rson m+1,r,rt*2+1ll tree[100001*4];ll flag[100001*4];void pushup(ll rt){ tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);}void pushdown(ll l,ll r,ll rt){ if(flag[rt]) { ll m=(l+r)/2; flag[rt*2]=flag[rt*2+1]=flag[rt]; tree[rt*2]=flag[rt]; tree[rt*2+1]=flag[rt]; flag[rt]=0; }}void build( ll l ,ll r , ll rt ){ flag[rt]=0; if( l == r ) { tree[rt]=0; flag[rt]=0; } else { ll m = (l+r)>>1 ; build(lson) ; build(rson) ; pushup(rt) ; }}void update(ll L,ll R,ll c,ll l,ll r,ll rt){ if(L<=l&&r<=R) { tree[rt]=c; flag[rt]=c; return ; } pushdown(l,r,rt); ll m=(l+r)/2; if(L<=m) { update(L,R,c,lson); } if(m<R) { update(L,R,c,rson); } pushup(rt);}ll query(ll L,ll R,ll l,ll r,ll rt){ if(L<=l&&r<=R) { return tree[rt]; } pushdown(l,r,rt); ll ans=0,m=(l+r)/2; if(L<=m)ans=max(ans,query(L,R,lson)); if(R>m)ans=max(ans,query(L,R,rson)); pushup(rt); return ans ;}/***********************/int main(){ while(~scanf("%I64d",&n)) { for(ll i=1; i<=n; i++)scanf("%I64d",&a[i]),a[i]--; build(1,n,1); for(ll i=1; i<=n; i++)update(i,i,a[i],1,n,1); ll q;scanf("%I64d",&q); while(q--) { ll Len,h; scanf("%I64d%I64d",&Len,&h); ll maxn=query(1,Len,1,n,1)+1; printf("%I64d\n",maxn); update(1,Len,maxn+h-1,1,n,1); } }}
- codeforces 272C. Dima and Staircase(线段树)
- Codeforces 272C Dima and Staircase 思维 or 线段树
- Codeforces 272C Dima and Staircase【线段树】
- Codeforces 272C Dima and Staircase 线段树区间覆盖,最值查询
- Codeforces 272C Dima and Staircase (线段树区间更新 或 线性扫)
- CodeForces 272C-Dima and Staircase-线段树区间更新-RMQ
- CodeForces - 272C Dima and Staircase (线段树区间更新)
- CF272C Dima and Staircase(线段树/贪心)
- CF 272 C. Dima and Staircase
- CODEFORCES 272C Dima and Staircase <细节理解题+简单技巧>
- CF 272C Dima and Staircase(水题)
- CodeForces 366C Dima and Salad
- Codeforces 366C Dima and Salad 【dp】
- codeforces 366 C Dima and Salad dp
- CodeForces 366C Dima and Salad
- CODEFORCES 272A Dima and Friends
- Codeforces Dima and Guards
- 【codeforces】Dima and Guards
- 集合划分问题
- 【转】HTTP与HTTPS的区别
- 怎么在html页面和js里判断是否是IE浏览器
- springboot如何测试打包部署
- 9月19日云栖精选夜读:阿里云MVP Meetup极客开跑,与MVP一起玩转云计算
- Codeforces 272C Dima and Staircase【线段树】
- SQL语句面试题目:一般查询和高级子查询
- 数据结构学习笔记(五)--单链表的代码实现(未完)
- 浏览器对象
- 51Nod 1292 字符串中的最大值 V2 后缀数组 + 单调栈
- asp.net mvc 导入 ajax excel,或者图片上传 后台不能接收的问题
- yum命令常用参数详解
- Google推荐的图片加载库Glide介绍
- 修改yum源——默认的源可能不稳定