1593: [Usaco2008 Feb]Hotel 旅馆

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 391  Solved: 228
[Submit][Status][Discuss]

Description

奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光。作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿。这个巨大的旅馆一共有N (1 <= N <= 50,000)间客房,它们在同一层楼中顺次一字排开,在任何一个房间里,只需要拉开窗帘,就能见到波光粼粼的湖面。 贝茜一行,以及其他慕名而来的旅游者,都是一批批地来到旅馆的服务台,希望能订到D_i (1 <= D_i <= N)间连续的房间。服务台的接待工作也很简单:如果存在r满足编号为r..r+D_i-1的房间均空着,他就将这一批顾客安排到这些房间入住;如果没有满足条件的r,他会道歉说没有足够的空房间,请顾客们另找一家宾馆。如果有多个满足条件的r,服务员会选择其中最小的一个。 旅馆中的退房服务也是批量进行的。每一个退房请求由2个数字X_i、D_i 描述,表示编号为X_i..X_i+D_i-1 (1 <= X_i <= N-D_i+1)房间中的客人全部离开。退房前,请求退掉的房间中的一些,甚至是所有,可能本来就无人入住。 而你的工作,就是写一个程序,帮服务员为旅客安排房间。你的程序一共需要处理M (1 <= M < 50,000)个按输入次序到来的住店或退房的请求。第一个请求到来前,旅店中所有房间都是空闲的。

Input

* 第1行: 2个用空格隔开的整数:N、M

* 第2..M+1行: 第i+1描述了第i个请求,如果它是一个订房请求,则用2个数字 1、D_i描述,数字间用空格隔开;如果它是一个退房请求,用3 个以空格隔开的数字2、X_i、D_i描述

Output

* 第1..??行: 对于每个订房请求,输出1个独占1行的数字:如果请求能被满足 ,输出满足条件的最小的r;如果请求无法被满足,输出0

Sample Input

10 6
1 3
1 3
1 3
1 3
2 5 5
1 6

Sample Output

1
4
7
0
5

HINT

 

Source

题解:萌萌哒线段树,这里面涉及到的问题是求最长0区间,然后也是可以通过区间分治的策略,也就是线段树来搞定;由于涉及到合并区间结果,所以需要存储一个左边的最长空格段和右边的最长空格段,便于维护,然后入住,退房神马的就是直接用tag实现区间赋值即可

(PS:在本机上逗比了N次,发现是tag处理还是有点偏差,还好交上去之后1A了。。。果然我自己还是太弱了OTL)

  1. var
  2. i,j,k,l,m,n:longint;
  3. a,b,c,lk,rk:array[..] of longint;
  4. function max(x,y:longint):longint;inline;
  5. begin
  6. if x>y then max:=x else max:=y;
  7. end;
  8. function min(x,y:longint):longint;inline;
  9. begin
  10. if x<y then min:=x else min:=y;
  11. end;
  12. procedure ext(z,x,y:longint);inline;
  13. begin
  14. if c[z]= then exit;
  15. case c[z] of
  16. :begin
  17. lk[z]:=y-x+;
  18. rk[z]:=y-x+;
  19. b[z]:=y-x+;
  20. a[z]:=;
  21. end;
  22. :begin
  23. lk[z]:=;
  24. rk[z]:=;
  25. b[z]:=;
  26. a[z]:=;
  27. end;
  28. end;
  29. if (x<>y) then
  30. begin
  31. c[z*]:=c[z];
  32. a[z*]:=c[z*];
  33. c[z*+]:=c[z];
  34. a[z*+]:=c[z*+];
  35. if c[z]= then
  36. begin
  37. b[z*]:=;
  38. lk[z*]:=;
  39. rk[z*]:=;
  40. b[z*+]:=;
  41. lk[z*+]:=;
  42. rk[z*+]:=;
  43. end
  44. else
  45. begin
  46. b[z*]:=(x+y) div -x+;
  47. lk[z*]:=b[z*];
  48. rk[z*]:=b[z*];
  49. b[z*+]:=y-(x+y) div ;
  50. lk[z*+]:=b[z*+];
  51. rk[z*+]:=b[z*+];
  52. end;
  53. end;
  54. c[z]:=;
  55. end;
  56.  
  57. procedure built(z,x,y:longint);inline;
  58. begin
  59. if x<>y then
  60. begin
  61. built(z*,x,(x+y) div );
  62. built(z*+,(x+y) div +,y);
  63. end;
  64. lk[z]:=y-x+;
  65. rk[z]:=y-x+;
  66. c[z]:=;
  67. b[z]:=y-x+;
  68. a[z]:=;
  69. end;
  70. procedure refresh(z,x,y:longint);
  71. begin
  72. if x=y then exit;
  73. b[z]:=max(b[z*],b[z*+]);
  74. b[z]:=max(b[z],rk[z*]+lk[z*+]);
  75. if lk[z*]=((y+x) div -x+) then
  76. lk[z]:=lk[z*]+lk[z*+]
  77. else
  78. lk[z]:=lk[z*];
  79. if rk[z*+]=(y-((x+y) div +)+) then
  80. rk[z]:=rk[z*+]+rk[z*]
  81. else
  82. rk[z]:=rk[z*+];
  83. if a[z*]=a[z*+] then a[z]:=a[z*] else a[z]:=;
  84. end;
  85. procedure put(z,x,y,l,r,t:longint);
  86. begin
  87. if l>r then exit;
  88. if (x=l) and (y=r) then
  89. begin
  90. c[z]:=t;
  91. ext(z,x,y);
  92. exit;
  93. end;
  94. ext(z,x,y);
  95. put(z*,x,(x+y) div ,l,min(r,(x+y) div ),t);
  96. put(z*+,(x+y) div +,y,max((x+y) div +,l),r,t);
  97. refresh(z,x,y);
  98. end;
  99. function approach(z,x,y,t:longint):longint;
  100. var a1,a2,a3,a4:longint;
  101. begin
  102. if c[z]= then exit(-);
  103. if c[z]= then
  104. begin
  105. if (y-x+)<t then exit(-) else exit(x);
  106. end;
  107. if lk[z]>=t then exit(x);
  108. if b[z]>=t then
  109. begin
  110. a1:=approach(z*,x,(x+y) div ,t);
  111. if a1<>- then exit(a1);
  112. if (rk[z*]+lk[z*+])>=t then exit((x+y) div -rk[z*]+);
  113. exit(approach(z*+,(x+y) div +,y,t));
  114. end;
  115. if rk[z]>=t then exit(y-rk[z]+);
  116. exit(-);
  117. end;
  118. begin
  119. readln(n,m);
  120. built(,,n);
  121. for i:= to m do
  122. begin
  123. read(j,k);
  124. case j of
  125. :begin
  126. l:=approach(,,n,k);
  127. if l=- then
  128. writeln()
  129. else
  130. begin
  131. put(,,n,l,l+k-,);
  132. writeln(l);
  133. end;
  134. end;
  135. :begin
  136. read(l);
  137. put(,,n,k,k+l-,);
  138. end;
  139. end;
  140. readln;
  141. end;
  142. end.

1593: [Usaco2008 Feb]Hotel 旅馆的更多相关文章

  1. BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆

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

  2. BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆 [线段树]

    传送门 题意: 操作1:找长为$len$的空区间并填满,没有输出$0$ 操作2:将$[l,r]$之间的区间置空 我真是太弱了这种线段树还写了一个半小时,中间为了查错手动模拟了$30min$线段树操作, ...

  3. 【BZOJ】1593: [Usaco2008 Feb]Hotel 旅馆

    [算法]线段树(经典线段树上二分) [题意]n个房间,m个询问,每次订最前的连续x个的空房间,或退订从x开始y个房间,求每次订的最左房间号. [题解]关键在于找连续x个空房间,经典二分. 线段树标记s ...

  4. bzoj 1593: [Usaco2008 Feb]Hotel 旅馆【线段树】

    参考:https://blog.csdn.net/u010336344/article/details/53034372 神一样的线段树 线段树上维护:ll从左开始最长空段:rr从右开始最长空段:le ...

  5. bzoj1593 [Usaco2008 Feb]Hotel 旅馆(线段树)

    1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 758  Solved: 419[Submit ...

  6. BZOJ1593 [Usaco2008 Feb]Hotel 旅馆

    裸上线段树,就是记的东西有点多... 每个点记区间左端最长0,右端最长0,中间最长0,和tag表示是否全为0/1 直接更新就好,查询的时候先查左儿子,然后查中间,最后查右儿子... /******** ...

  7. 线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel

    题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间 ...

  8. 【bzoj1593】[Usaco2008 Feb]Hotel 旅馆 线段树区间合并

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

  9. 【最长连续零 线段树】bzoj1593: [Usaco2008 Feb]Hotel 旅馆

    最长连续零的线段树解法 Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负 责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大 ...

随机推荐

  1. 状态开关按钮(ToggleButton)与开关(Switch)的功能与用法

    状态开关按钮(ToggleButton)与开关(Switch)也是由Button派生出来的,因此它们的本质也是按钮,Button支持的各种属性.方法也适用于ToggleButton和Switch.从功 ...

  2. iReport默认参数和变量的含义解析【转】

    iReport默认参数和变量的含义解析[转] http://uule.iteye.com/blog/775338 参考:http://blog.csdn.net/terryzero/article/d ...

  3. Pomelo术语解释

    gate服务器 一个应用的gate服务器,一般不参与rpc调用,也就是说其配置项里可以没有port字段,仅仅有clientPort字段,它的作用是做前端的负载均衡.客户端往往首先向gate服务器发出请 ...

  4. Java split字符串中包含.的情况

    "a.b".split(".")的语句会返回[],必须进行转义, "a.b".split("\\.")

  5. PWM(脉宽调制)——LED特效呼吸灯设计

    简述PWM PWM--脉宽调制信号(Pulse Width Modulation),它利用微处理器的数字输出来实现,是对模拟电路控制的一种非常有效的技术,广泛应用于测量.通信.功率控制与变化等许多领域 ...

  6. loadrunner controller:实时查看VUser的运行情况

    1)         如下图,在Run标签页,点击"Vusers..."打开Vuser窗口: 2)         如下图选中一个Vuser点击按钮可以打开Run-Time Vie ...

  7. KB奇遇记(2):缘起

    最早听到这家公司的名字,大概还是在好几年前. 正是2012年,之前的在一起灿坤待过的同事LY在这家公司当高层,正好公司规模大了,要上ERP项目.苦于公司没有这方面的人才,而内部IT又太差劲支撑不起来. ...

  8. 【G】开源的分布式部署解决方案 - 预告篇

    为什么想到要做分布式部署解决方案? 当项目越做越大以后,你会发现部署变成一件极其头疼的事情.当然头疼的绝不仅仅在部署一个环节,比如新服务器环境搭建当中就许多坑要踩.各种重复性的工作,包括但不仅限于增加 ...

  9. Surface Dial 与 Windows Wheel UWP应用开发

    随着微软发布 Surface Studio 在演示视频中非常抢眼的一个配件就是 Surface Dial,Dial 是Windows输入设备大家庭中的新成员我们把它归类为Windows Wheel 类 ...

  10. 2017<java技术>预备作业计科冀浩然

    1.阅读邹欣老师的博客,谈谈你期望的师生关系是什么样的? 我期望的师生关系是相互融洽的,老师能够在上课的时候尽量多的教我们专业知识,可以尽量多和我们进行互动,课下能和我们如同朋友一般就可以了. 2.你 ...