您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: