HDU2795 Billboard 线段树
2015-08-18 21:29
399 查看
这是一道简单的线段树,只需要考虑好我们建树的方式即可!
我们以高h来建树,点的权值为W,通过来维护区间的最大值,我们很快就能查找到编号最小的点切大于等于wi。。明白之后就是一道简单的线段树单点更新,维护区间最小值。
我们以高h来建树,点的权值为W,通过来维护区间的最大值,我们很快就能查找到编号最小的点切大于等于wi。。明白之后就是一道简单的线段树单点更新,维护区间最小值。
#include<stdio.h> #include<string.h> #include<math.h> #include<queue> #include<vector> #include<iostream> #include<string> #include<set> #include<map> #include<algorithm> using namespace std; #pragma comment(linker, "/STACK:1024000000,1024000000") #define nn 200010 #define LL long long #define ULL unsiged long long #define mod 0x7fffffff #define inf oxfffffffffff #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 int tree[nn<<2]; int ans; void pushup(int rt) { tree[rt]=max(tree[rt<<1],tree[rt<<1|1]); } void build(int l,int r,int rt,int w) { if(l==r) { tree[rt]=w; return; } int mid=(l+r)>>1; build(lson,w); build(rson,w); pushup(rt); } void query(int num,int l,int r,int rt) { if(tree[rt]<num) return; if(l==r) { tree[rt]-=num; //printf("A==%d %d\n",l,r); ans=l; return; } int mid=(l+r)>>1; //printf("%d %d %d\n",mid,l,r); if(tree[rt<<1]>=num) query(num,lson); else query(num,rson); pushup(rt); } int main() { int h,w,n; while(~scanf("%d%d%d",&h,&w,&n)) { int m=min(h,n); build(1,m,1,w); while(n--) { int a; ans=-1; scanf("%d",&a); query(a,1,m,1); printf("%d\n",ans); } } return 0; }
相关文章推荐
- 试题系列二(求1000内的完数)
- Android BroadCastReceiver介绍
- HDU 2094 产生冠军 <拓扑算法+map函数>
- vijos - P1543极值问题(斐波那契数列 + 公式推导 + python)
- Redis学习笔记(3)
- hdu 2566 统计硬币
- C# string[,]与string[][]的区别
- CSS选择符的种类以及对比分析
- C99中的新增数据类型
- 爱程序网网站
- 第一章--概述
- HDU 4612--Warm up 【无向图边双连通求桥数 && 缩点后重建图求树的直径】
- GDOI2016模拟8.18找数
- NS3网络仿真(13): FdNetDevice的问题
- HDU 1222(数论,最大公约数)
- 编译并打包第一个Hadoop程序
- hdu1312
- 【汉化硬盘版】Muv-luv+Muv-Luv Alternative(带全CG存档+免安装,卸载补丁+打开存档文件夹补丁+中文攻略)
- python 数据类型 序列——列表
- Hdu oj 1596 find the safest road