hdu 2795 线段树
2015-09-14 21:26
190 查看
比较简单的线段树,查询的时候如果左子树够的话就向左递归,否则向右递归,到叶子时终止。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N = 200001; int h, w, n; int max( int x, int y ) { return x > y ? x : y; } struct Node { int l, r, maxn; } node[N << 2]; void build( int i, int l, int r ) { node[i].l = l, node[i].r = r, node[i].maxn = w; if ( l == r ) return ; int mid = ( l + r ) >> 1; build( i << 1, l, mid ); build( i << 1 | 1, mid + 1, r ); } int query( int i, int len ) { if ( node[i].l == node[i].r ) { node[i].maxn -= len; return node[i].l; } int r; if ( node[i << 1].maxn >= len ) { r = query( i << 1, len ); } else { r = query( i << 1 | 1, len ); } node[i].maxn = max( node[i << 1].maxn, node[i << 1 | 1].maxn ); return r; } int main () { while ( scanf("%d%d%d", &h, &w, &n) != EOF ) { if ( h < n ) build( 1, 1, h ); else build( 1, 1, n ); for ( int i = 1; i <= n; i++ ) { int len; scanf("%d", &len); if ( node[1].maxn < len ) { printf("-1\n"); } else { int ans = query( 1, len ); printf("%d\n", ans); } } } return 0; }
相关文章推荐
- 前端开发面试要点及对策
- 分布式消息队列,两种常规方案
- (4.4.12)Android开发:如何实现TCP和UDP传输
- UI 第六节 uisegmentedControl uiimage uislider 课后习题
- 自定义MITK PlanarFigure及困惑
- URLConnection/Android Stutio中HttpClient的添加jar包方法和DoGet、DoPost的用法
- 一些摄像机标定的Matlab工具箱(含Kinect和激光)
- C实现面向对象
- mybatis调用存储过程
- Effective Java 英文 第二版 读书笔记 Item 6:Eliminate obsolete object references
- SPOJ FFT TSUM
- 数据库的配置
- Hibernate注释大全收藏
- JNI初体验
- 轮式驱动单元电机PID控制说明
- 研究生选导师失败经历
- Linux_rpm和yum实现程序包管理功能
- 对多线程对订单更新竞争的锁机制的实现-初构
- Spring缓存注解@Cache使用
- 解决toolbar嵌套nav进行页面跳转的时候有向下动作的问题