您的位置:首页 > 理论基础 > 数据结构算法

POJ 3667 Hotel

2014-03-10 15:35 239 查看
有点被一些题解误导了。。。。。。

先是要用 

lfrl记最大左连续房间 

rfrl记最大右连续房间

tfrl记最大连续房间。

(frl不是恶趣味啊。明明是 free length 啊。。。)

说是开个域记覆盖情况。

-1表mix    0表empty     1表full

操操操。WA了三次。仔细一看AC程序。

这不就是Lazy-tag吗。。。

重新说一遍:

-1表没有信息要down

0表有empty的信息要down

1表有full 的信息要down

所以建树的时候可以全都赋-1。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lson tr[rt].ls
#define rson tr[rt].rs
using namespace std;

const int N=50100;
struct segtr {int l,r,ls,rs,lfrl,rfrl,tfrl,cov;} tr[N*4];
int n,m,i,x,len,k,tot,rt;

void mktr(int &rt,int l,int r)
{
rt=++tot;
tr[rt].l=l;
tr[rt].r=r;
tr[rt].cov=-1;
tr[rt].lfrl=tr[rt].rfrl=tr[rt].tfrl=r-l+1;
if (l==r) return;
int mid=(l+r)>>1;
mktr(lson,l,mid);
mktr(rson,mid+1,r);
}

void down(int rt)
{
if (tr[rt].r==tr[rt].l||tr[rt].cov==-1) return;
int k=tr[rt].cov;
tr[lson].cov=tr[rson].cov=k;
tr[lson].lfrl=tr[lson].rfrl=tr[lson].tfrl=k?0:tr[lson].r-tr[lson].l+1;
tr[rson].lfrl=tr[rson].rfrl=tr[rson].tfrl=k?0:tr[rson].r-tr[rson].l+1;
tr[rt].cov=-1;
}

void empty(int rt,int l,int r,int k)
{
if (tr[rt].l==l && tr[rt].r==r)
{
tr[rt].cov=k;
tr[rt].lfrl=tr[rt].rfrl=tr[rt].tfrl=k?0:r-l+1;
return;
}
down(rt);
if (r<=tr[lson].r) empty(lson,l,r,k);
else if (l>=tr[rson].l) empty(rson,l,r,k);
else empty(lson,l,tr[lson].r,k),empty(rson,tr[rson].l,r,k);
int ll=tr[rt].l,rr=tr[rt].r;
int mid=(ll+rr)>>1;
tr[rt].lfrl=tr[lson].tfrl==mid-ll+1?mid-ll+1+tr[rson].lfrl:tr[lson].lfrl;
tr[rt].rfrl=tr[rson].tfrl==rr-mid?rr-mid+tr[lson].rfrl:tr[rson].rfrl;
tr[rt].tfrl=max(max(tr[lson].tfrl,tr[rson].tfrl),tr[lson].rfrl+tr[rson].lfrl);
}

int query(int rt,int len)
{
down(rt);
if (tr[rt].tfrl<len) return 0;
int res=0;
if (tr[lson].tfrl>=len) res=query(lson,len);
if (res) return res;
if (tr[lson].rfrl+tr[rson].lfrl>=len)
{
int l=tr[lson].r-tr[lson].rfrl+1;
int r=l+len-1;
empty(1,l,r,1);
return l;
}
return query(rson,len);
}

int main()
{
scanf("%d%d",&n,&m);
rt=0;
mktr(rt,1,n);
for (i=1;i<=m;i++)
{
scanf("%d",&k);
if (k==1) scanf("%d",&len),printf("%d\n",query(1,len));
else scanf("%d%d",&x,&len),empty(1,x,x+len-1,0);
}
return 0;
}


.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  POJ 数据结构