题目:http://www.codeforces.com/problemset/problem/46/D
题意:就是模拟车的停靠,然后要求车前和车后要有空间。。。
分析:这个跟这题差不多,每辆车的长度变成b+f+车长,把整个停车场也加上b和f,那么就不用考虑空间了,直接做就行。。。总长度居然是0~l-1。。。我以为是到l的。。。无限的wa啊。。。
代码:
#include<cstdio>
#include<iostream>
#define ls rt<<1
#define rs rt<<1|1
#define lson l,m,ls
#define rson m+1,r,rs
#define uprt rt,m-l+1,r-m
using namespace std;
const int mm=111111;
const int mn=mm<<2;
int dly[mn],ml[mn],lm[mn],rm[mn];
int sl[mm],sr[mm];
void set(int rt,int op,int len)
{
ml[rt]=lm[rt]=rm[rt]=op?len:0;
dly[rt]=op;
}
void pushdown(int rt,int l1,int l2)
{
if(dly[rt]<0)return;
set(ls,dly[rt],l1);
set(rs,dly[rt],l2);
dly[rt]=-1;
}
void pushup(int rt,int l1,int l2)
{
ml[rt]=max(rm[ls]+lm[rs],max(ml[ls],ml[rs]));
lm[rt]=lm[ls],rm[rt]=rm[rs];
if(lm[rt]>=l1)lm[rt]+=lm[rs];
if(rm[rt]>=l2)rm[rt]+=rm[ls];
}
void build(int l,int r,int rt)
{
ml[rt]=lm[rt]=rm[rt]=r-l+1;
dly[rt]=-1;
if(l==r)return;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void updata(int L,int R,int op,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
set(rt,op,r-l+1);
return;
}
int m=(l+r)>>1;
pushdown(uprt);
if(L<=m)updata(L,R,op,lson);
if(R>m)updata(L,R,op,rson);
pushup(uprt);
}
int query(int x,int l,int r,int rt)
{
if(lm[rt]>=x)return l;
int m=(l+r)>>1,ret;
pushdown(uprt);
if(ml[ls]>=x)ret=query(x,lson);
else if(rm[ls]+lm[rs]>=x)ret=m-rm[ls]+1;
else ret=query(x,rson);
pushup(uprt);
return ret;
}
int main()
{
int i,j,k,t,l,b,f,n;
while(~scanf("%d%d%d",&l,&b,&f))
{
scanf("%d",&n);
l=b+l+f-1;
build(0,l,1);
for(t=1;t<=n;++t)
{
scanf("%d%d",&i,&j);
if(i==1)
{
if(ml[1]>=b+j+f)
{
k=query(b+j+f,0,l,1);
printf("%d\n",k);
sl[t]=k+b;
sr[t]=k+b+j-1;
updata(sl[t],sr[t],0,0,l,1);
}
else puts("-1");
}
else updata(sl[j],sr[j],1,0,l,1);
}
}
return 0;
}