标签:没有 插入 html 高度 www. pre tps lam htm
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795
题目大意:有一个h*w的公告牌,要在其上贴公告。现在有n个公告,每个公告的尺寸为1*wi,即高度都为1,现在依次给出n个公告的宽度wi,需要求出每个公告在广告牌所在的行数。要求:对于同一个公告尽量贴在公告牌的上方,如果高度一致,尽量贴在广告牌的左侧。如果没有合适的位置,则输出-1.
例:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
#define maxn 200005
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define pushup() tree[root]=max(tree[root<<1],tree[root<<1|1])
int tree[maxn<<2];
int n,h,w,x;
void build(int l,int r,int root)
{
if(l==r)
{
tree[root]=w;
return;
}
int mid=l+r>>1;
build(lson);
build(rson);
pushup();
}
int query(int val,int l,int r,int root)
{
if(l==r)
{
tree[root]-=val;
return l;
}
int mid=l+r>>1;
int ans;
if(val<=tree[root])
{
if(tree[root<<1]>=val)
ans=query(val,lson);
else
ans=query(val,rson);
}
pushup();
return ans;
}
int main()
{
while(~scanf("%d%d%d",&h,&w,&n))
{
if(h>n)
h=n;
build(1,h,1);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(x>tree[1])
printf ("%d\n",-1);
else
printf("%d\n",query(x,1,h,1));
}
}
return 0;
}
标签:没有 插入 html 高度 www. pre tps lam htm
原文地址:https://www.cnblogs.com/zjl192628928/p/9697146.html