/* 线段树想法题,只有叶子节点放海报,那么每个叶子节点就是行
*/
#include<cstdio>
#include<iostream>
#define lson id << 1
#define rson id << 1 | 1
using namespace std;
struct Line
{
int Max;
int left,right;
int mid()
{
return (left + right) / 2;
}
}node[1000008];
void _Build_Tree(int id,int l,int r,int w)
{
// cout << id<<endl;
node[id].left = l;node[id].right = r;
node[id].Max = w;
if(l == r) return ;
int mid = node[id].mid();
_Build_Tree(lson,l,mid,w);
_Build_Tree(rson,mid+ 1,r,w);
}
void PushUp(int id)
{
node[id].Max = max(node[lson].Max,node[rson].Max);
}
int flag;
void insert(int id,int y)
{
// cout <<"y=="<< id<<endl;
if(node[id].left == node[id].right) // 每个叶子放海报
{
flag = 1;
node[id].Max -= y;// 放下海报,则减去海报的长度
printf("%d\n",node[id].left);
return ;
}
if(node[lson].Max >= y) insert(lson,y);
else if(node[rson].Max >= y) insert(rson,y);
else return;
PushUp(id);
}
int main()
{
int n,m,h,w;
// freopen("input.txt","r",stdin);
while(~scanf("%d%d%d",&h,&w,&m))
{
if(h > m) h = m;
_Build_Tree(1,1,h,w);
while (m--)
{
flag = 0;
scanf("%d",&n);
if(node[1].Max>=n)insert(1,n); // 这个判断只有一个根节点的时候
if(!flag) printf("%d\n",-1);
}
}
}
HDU 2795 线段树想法题 (第4天)
最新推荐文章于 2014-11-03 16:47:19 发布