[BZOJ1593] [Usaco2008 Feb]Hotel 旅馆

原创 2015年11月21日 17:37:29

传送门

http://www.lydsy.com/JudgeOnline/problem.php?id=1593

题目大意

两种操作
1.询问连续长度为x的最左端点,并将这段覆盖
2.将区间[L,R]区间取消覆盖

题解

记录区间
1.左端点连续没覆盖的长度
2.右端点连续没覆盖的长度
3.区间最长连续没覆盖的长度
修改之后回溯的时候合并注意讨论即可
详细见code

const
 maxn=50005;
var
 w:array[0..8*maxn,1..7]of longint;
 i,j,k:longint;
 n,m,a,b,c,ans:longint;
procedure build(a,l,r:longint);
var mid:longint;
begin
 w[a,1]:=l; w[a,2]:=r; w[a,3]:=r-l+1; w[a,4]:=r-l+1; w[a,5]:=r-l+1; w[a,6]:=-1;
 if l=r then exit;
 mid:=(l+r)>>1;
 build(a<<1,l,mid); build(a<<1+1,mid+1,r);
end;

procedure pushdown(a:longint);
begin
 if (w[a,6]=0)and(w[a,1]<>w[a,2]) then begin
  w[a<<1,3]:=w[a<<1,2]-w[a<<1,1]+1; w[a<<1,4]:=w[a<<1,3]; w[a<<1,5]:=w[a<<1,3];
  w[a<<1+1,3]:=w[a<<1+1,2]-w[a<<1+1,1]+1; w[a<<1+1,4]:=w[a<<1+1,3]; w[a<<1+1,5]:=w[a<<1+1,3];
  w[a<<1,6]:=w[a,6]; w[a<<1+1,6]:=w[a,6];
 end;
 if (w[a,6]=1)and(w[a,1]<>w[a,2]) then begin
  w[a<<1,3]:=0; w[a<<1,4]:=0; w[a<<1,5]:=0;
  w[a<<1+1,3]:=0; w[a<<1+1,4]:=0; w[a<<1+1,5]:=0;
  w[a<<1,6]:=w[a,6]; w[a<<1+1,6]:=w[a,6];
 end;
 w[a,6]:=-1;
end;

function query(a,b:longint):longint;
var mid:longint;
begin
 if w[a,6]<>-1 then pushdown(a);
 if w[a,1]=w[a,2] then exit(1);
 mid:=(w[a,1]+w[a,2])>>1;
 if w[a<<1,5]>=b then exit(query(a<<1,b)) else
 if w[a<<1,4]+w[a<<1+1,3]>=b then exit(mid-w[a<<1,4]+1)
 else exit(query(a<<1+1,b));
end;

procedure update(a,l,r,c:longint);
var mid,d:longint;
begin
 if w[a,6]<>-1 then pushdown(a);
 if (w[a,1]=l)and(w[a,2]=r) then begin
  w[a,6]:=c;
  if c=1 then d:=0 else d:=w[a,2]-w[a,1]+1;
  w[a,3]:=d; w[a,4]:=d; w[a,5]:=d;
  exit;
 end;
 mid:=(w[a,1]+w[a,2])>>1;
 if r<=mid then update(a<<1,l,r,c) else
 if l>mid then update(a<<1+1,l,r,c)
 else begin
  update(a<<1,l,mid,c);
  update(a<<1+1,mid+1,r,c);
 end;
 w[a,3]:=w[a<<1,3]; w[a,4]:=w[a<<1+1,4];
 if w[a<<1,4]=w[a<<1,2]-w[a<<1,1]+1 then inc(w[a,3],w[a<<1+1,3]);
 if w[a<<1+1,3]=w[a<<1+1,2]-w[a<<1+1,1]+1 then inc(w[a,4],w[a<<1,4]);
 w[a,5]:=w[a<<1,5]; if w[a<<1+1,5]>w[a,5] then w[a,5]:=w[a<<1+1,5];
 if w[a<<1,4]+w[a<<1+1,3]>w[a,5] then w[a,5]:=w[a<<1,4]+w[a<<1+1,3];
end;

begin
 readln(n,m);
 build(1,1,n);
 for i:=1 to m do
  begin
   read(a);
   if a=1
   then begin
    readln(b);
    if w[1,5]<b then begin writeln(0); continue; end;
    ans:=query(1,b); writeln(ans);
    update(1,ans,ans+b-1,1);
   end
   else begin
    readln(b,c);
    update(1,b,b+c-1,0);
   end;
  end;
end.
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

BZOJ 1593 : [Usaco2008 Feb]Hotel 旅馆

1593: [Usaco2008 Feb]Hotel 旅馆Time Limit: 10 Sec Memory Limit: 64 MB Submit: 750 Solved: 414 [Sub...

BZOJ1593: [Usaco2008 Feb]Hotel 旅馆 线段树

1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec  Memory Limit: 64 MB Description 奶牛们最近的旅游计划,是到苏...
  • Oakley_
  • Oakley_
  • 2016年08月11日 16:22
  • 281

[BZOJ1593][Usaco2008 Feb]Hotel 旅馆(线段树)

题目描述传送门题解十倍经验题= = 线段树的一个结点维护3个值,分别是区间最长,左端点连续最长,右端点连续最长,然后就可以搞了。 update的时候注意分几种情况,还有整个区间都被覆盖的特殊情况。...

BZOJ1593 洛谷2894 [Usaco2008 Feb]Hotel 旅馆

题目描述The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a v...

BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆

Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光。作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿。这个巨大的旅馆一共有N (1...

BZOJ1593 [Usaco2008 Feb]Hotel 旅馆 线段树

Description 奶 牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光。作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿。这个 巨大的旅馆一共有N (1...

bzoj1593[Usaco2008 Feb]Hotel旅馆

线段树

bzoj1593&poj3667 【Usaco2008 Feb】Hotel

线段树

BZOJ 1610: [Usaco2008 Feb]Line连线游戏

Description Farmer John最近发明了一个游戏,来考验自命不凡的贝茜。游戏开始的时 候,FJ会给贝茜一块画着N (2 ...

BZOJ 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐

Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐。每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[BZOJ1593] [Usaco2008 Feb]Hotel 旅馆
举报原因:
原因补充:

(最多只允许输入30个字)