您的位置:首页 > 编程语言 > Go语言

hdu 2795 Billboard(线段树)

2015-07-23 15:17 691 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795

题       意:有一个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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm 线段树