hdu 2795 Billboard(线段树)
2015-07-23 15:17
691 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795
题 意:有一个n*m的木板,给你k个长度的L的物品,问能否放在木板上,能放在第几行。
思 路:用线段树的方法建一个树,在树上查找第一个比L大的位置。
代码如下:
题 意:有一个n*m的木板,给你k个长度的L的物品,问能否放在木板上,能放在第几行。
思 路:用线段树的方法建一个树,在树上查找第一个比L大的位置。
代码如下:
#include <iostream> using namespace std; #include <string.h> #include <stdio.h> #include <queue> #include <algorithm> #define m1 888888 int vis[m1],m; void build( int l, int r ,int rt )//rt编号 { if( l == r ) { vis[rt]=m; return ; } int m = ( l + r ) >> 1; build( l, m, rt<<1 ); build( m+1, r, rt<<1|1); vis[rt]=max(vis[rt<<1],vis[rt<<1|1]); } int query( int len, int l, int r, int rt ) { if( l == r ) { vis[rt]-=len; return l; } int m = ( l + r ) >> 1; int ret; if( vis[rt<<1] >= len ) ret =query(len,l,m,rt<<1);//左子树有比len大的就走左边 else ret =query(len,m+1,r,rt<<1|1);//否则走右边 vis[rt]=max(vis[rt<<1],vis[rt<<1|1]);//更新数据 return ret; } int main() { int n, k; while( scanf ( "%d %d %d", &n, &m, &k ) != EOF ) { if(k<n) n=k; build(1,n,1); while(k--) { int x; scanf ( "%d", &x ); if(x>vis[1]) printf("-1\n");//比树的顶点(最大值)大,放不进去 else printf("%d\n",query(x,1,n,1)); } } return 0; }
相关文章推荐
- Javascript SHA-1:Secure Hash Algorithm
- [转]可视化的数据结构和算法
- 统计文件中不小于某一长度的单词的个数(泛型算法实现)
- 线段树题集
- 使用他人的MD5编码类,修改形成密码串
- Extracting Structured Data from Web Pages
- (译)Cocos2d_for_iPhone_1_Game_Development_Cookbook:1.13使用CCTexture2DMutable调换调色盘
- Java中3DES加密
- Refactoring Notes-Refactoring Methods(3)
- 图书馆管理程序~~不过貌似功能!!有空再修修
- trainging contest#2(2011成都现场赛)I BY Hyoga
- C/C++头文件包含内容概览
- 堆栈的应用(1) 平衡符号 C++实现
- 程序员编程艺术第一章、左旋转字符串
- 程序员编程艺术:第三章续、Top K算法问题的实现
- 程序员编程艺术:第四章、现场编写类似strstr/strcpy/strpbrk的函数
- 十四、第三章再续:快速选择SELECT算法的深入分析与实现
- 程序员编程艺术:第七章、求连续子数组的最大和
- 程序员编程艺术:第八章、从头至尾漫谈虚函数
- 程序员编程艺术:第九章、闲话链表追赶问题