您的位置:首页 > 其它

HDU-2795 Billboard 线段树单点更新

2014-03-28 22:12 417 查看
题目链接

#include "stdio.h"
const int maxn = 200005;
int tree[maxn*3];
int v,w,ans;
int Min( int a,int b )
{
return a<b?a:b;
}
void buildtree( int ld,int rd,int t )
{
tree[t] = 0;
if( ld == rd )
return;
else
{
int mid = ( ld+rd )>>1;
buildtree( ld,mid,t*2 );
buildtree( mid+1,rd,t*2+1 );
}
}
void updata( int ld,int rd,int t )
{
if( ld==rd )
{
if( tree[t] + v > w )
return;
tree[t] += v;
ans = rd;
}
else
{
int mid = ( ld+rd )>>1;
if( tree[t*2]+v <= w )
updata( ld,mid,t*2 );
else if( tree[t*2+1]+v <= w )
updata( mid+1,rd,t*2+1 );
tree[t] = Min( tree[t*2] , tree[t*2+1]);
}
}
int main()
{
int i,h,n,len;
while( scanf("%d%d%d",&h,&w,&n)==3 )
{
len = h<n?h:n;
buildtree( 1,len,1 );
for( i=1;i<=n;i++ )
{
scanf("%d",&v);          // v the width of i-th announcement
if( v > w )
printf("-1\n");
else
{
ans = -1;
updata( 1,len,1 );
printf("%d\n",ans);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: