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。
.
先是要用
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; }
.
相关文章推荐
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- java数据结构和算法学习之汉诺塔示例
- Java数据结构之简单链表的定义与实现方法示例
- qqwry.dat的数据结构图文解释第1/2页
- 查询json的数据结构的8种方式简介
- Java数据结构之双端链表原理与实现方法
- LinkedList学习示例模拟堆栈与队列数据结构
- python实现bitmap数据结构详解
- Huffman 编码压缩算法
- C 的反思穷究链表
- 专用链表VS通用链表
- 通用单向链表设计(一)——接口的设计
- 通用单向链表设计(二)——接口的实现
- 通用单向链表设计(三)——接口的测试
- 数据结构&算法学习
- 第二话:数据结构的历史与来由
- 第一话:你的数据结构怎么学的?
- 鸟瞰数据结构的知识点全貌
- 数据结构的基本概念和术语