标签:integer call rest bottom stripe nes esc hang print
3 5 5 2 4 3 3 3
1 2 1 3 -1
贴广告,每次贴左上角(假设能够),线段树的le ri,保存的是行。由于题目要求输出来广告贴的是第几行,f[pos].va保存的
是从le到ri的(这么多行的)每行剩余宽度的最大值(用来推断能否贴这个广告),还要注意的是最上面的一行是第一行
后面另一个要注意的地方在代码提示
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
using namespace std;
#define N 200005
int h,n,w;
int ans;
struct stud{
int le,ri;
int len;
}f[N*4];
void build(int pos,int le,int ri)
{
f[pos].le=le;
f[pos].ri=ri;
f[pos].len=w;
if(le==ri) return ;
int mid=MID(le,ri);
build(L(pos),le,mid);
build(R(pos),mid+1,ri);
}
void query(int pos,int va)
{
if(f[pos].le==f[pos].ri)
{
f[pos].len-=va;
ans=f[pos].le;
return ;
}
if(f[L(pos)].len>=va)
query(L(pos),va);
else
query(R(pos),va);
//以下是我犯错误的一个地方,由于我原来是定义 query 为int 返回值,
//那样就不会进行以下这一步了(由于已经返回了)
f[pos].len=max(f[L(pos)].len,f[R(pos)].len);
}
int main()
{
while(~scanf("%d%d%d",&h,&w,&n))
{
if(h>n) h=n;
build(1,1,h);
int m=n;
int len;
while(m--)
{
scanf("%d",&len);
if(f[1].len>=len)
{
query(1,len);
printf("%d\n",ans);
}
else
printf("-1\n");
}
}
return 0;
}
标签:integer call rest bottom stripe nes esc hang print
原文地址:http://www.cnblogs.com/ljbguanli/p/6911986.html