题面:P2894 [USACO08FEB]酒店Hotel

题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间(mx)。询问时由于查询的是最左边的合法端点,所以要从左到中间到右边依次考虑情况。

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #define max(a,b) ((a)>(b)?(a):(b))
  5. using namespace std;
  6. const int maxn=+,maxm=+;
  7. int N,M,o,D,X,ans;
  8. inline int rd(){
  9. int x=;char c=getchar();
  10. while(c<''||c>'')c=getchar();
  11. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  12. return x;
  13. }
  14. struct Tree{
  15. int l,r,lazy,h_,t_,mx;
  16. }t[maxn<<];
  17. inline void Pushup(int x){
  18. int ls=x<<,rs=x<<|;
  19. if(t[ls].r-t[ls].l+==t[ls].mx)t[x].h_=t[ls].mx+t[rs].h_;else t[x].h_=t[ls].h_;
  20. if(t[rs].r-t[rs].l+==t[rs].mx)t[x].t_=t[rs].mx+t[ls].t_;else t[x].t_=t[rs].t_;
  21. t[x].mx=max(t[ls].mx,t[rs].mx);
  22. t[x].mx=max(t[x].mx,t[ls].t_+t[rs].h_);
  23. return;
  24. }
  25. inline void Build(int x,int l,int r){
  26. t[x].l=l;t[x].r=r;t[x].lazy=-;
  27. if(l==r){
  28. t[x].h_=t[x].t_=t[x].mx=;
  29. return;
  30. }
  31. int mid=(l+r)>>;
  32. Build(x<<,l,mid);Build(x<<|,mid+,r);
  33. Pushup(x);
  34. return;
  35. }
  36. inline void Pushdown(int x){
  37. if(t[x].lazy>=){
  38. int k=t[x].lazy,ls=x<<,rs=x<<|;t[x].lazy=-;
  39. if(k==){
  40. t[ls].h_=t[ls].t_=t[ls].mx=;
  41. t[rs].h_=t[rs].t_=t[rs].mx=;
  42. }
  43. else{
  44. t[ls].h_=t[ls].t_=t[ls].mx=t[ls].r-t[ls].l+;
  45. t[rs].h_=t[rs].t_=t[rs].mx=t[rs].r-t[rs].l+;
  46. }
  47. t[ls].lazy=t[rs].lazy=k;
  48. }
  49. return;
  50. }
  51. inline int Solve(int x,int d){
  52. int ls=x<<,rs=x<<|,l=t[x].l,r=t[x].r;
  53. if(r-l+==t[x].mx&&t[x].mx==d)return l;
  54. Pushdown(x);
  55. if(t[ls].mx>=d)return Solve(ls,d);
  56. if(t[ls].t_+t[rs].h_>=d)return (t[ls].r-t[ls].t_+);
  57. if(t[rs].mx>=d)return Solve(rs,d);
  58. return ;
  59. }
  60. inline void Update(int x,int ql,int qr,int o){
  61. int l=t[x].l,r=t[x].r;
  62. if(ql<=l&&r<=qr){
  63. if(o==)t[x].h_=t[x].t_=t[x].mx=;
  64. else t[x].h_=t[x].t_=t[x].mx=r-l+;
  65. t[x].lazy=o;
  66. return;
  67. }
  68. int mid=(l+r)>>,ls=x<<,rs=x<<|;
  69. Pushdown(x);
  70. if(ql<=mid)Update(ls,ql,qr,o);
  71. if(qr>mid)Update(rs,ql,qr,o);
  72. Pushup(x);
  73. return;
  74. }
  75. inline void write(int x){
  76. char a[];int len=;
  77. for(;x;x/=)a[len++]=x%;
  78. if(!len)putchar('');
  79. else while(len)putchar(a[--len]+'');
  80. putchar('\n');
  81. }
  82. int main(){
  83. N=rd();M=rd();
  84. Build(,,N);
  85. while(M--){
  86. o=rd();
  87. if(o==){
  88. D=rd();
  89. ans=Solve(,D);
  90. write(ans);
  91. if(ans)Update(,ans,ans+D-,);//1表示有住人
  92. }
  93. else{
  94. X=rd();D=rd();
  95. Update(,X,X+D-,);
  96. }
  97. }
  98. return ;
  99. }

//我为了卡常加入了快速读入和快速输出,实际食用代码时完全可以无视。


By:AlenaNuna

线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel的更多相关文章

  1. luogu P2894 [USACO08FEB]酒店Hotel

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

  2. 洛谷P2894 [USACO08FEB]酒店Hotel

    P2894 [USACO08FEB]酒店Hotel https://www.luogu.org/problem/show?pid=2894 题目描述 The cows are journeying n ...

  3. P2894 [USACO08FEB]酒店Hotel

    P2894 [USACO08FEB]酒店Hotel 简单的线段树维护区间信息. 维护三个值,一个是从左端点能拓展的长度,一个是从右端点能脱产的的长度.另一个是整个区间内的最大连续零一长度. 记录这三个 ...

  4. 洛谷 P2894 [USACO08FEB]酒店Hotel 解题报告

    P2894 [USACO08FEB]酒店Hotel 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultur ...

  5. 线段树||BZOJ5194: [Usaco2018 Feb]Snow Boots||Luogu P4269 [USACO18FEB]Snow Boots G

    题面:P4269 [USACO18FEB]Snow Boots G 题解: 把所有砖和靴子排序,然后依次处理每一双靴子,把深度小于等于它的砖块都扔线段树里,问题就转化成了求线段树已有的砖块中最大的砖块 ...

  6. 洛谷P2894 [USACO08FEB]酒店Hotel [线段树]

    题目传送门 酒店 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and ...

  7. 洛谷P2894[USACO08FEB]酒店Hotel(线段树)

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

  8. 洛谷 P2894 [USACO08FEB]酒店Hotel

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

  9. 区间连续长度的线段树——洛谷P2894 [USACO08FEB]酒店Hotel

    https://www.luogu.org/problem/P2894 #include<cstdio> #include<iostream> using namespace ...

随机推荐

  1. javascript arguments介绍

    来源于: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments https://g ...

  2. PCA实现

    代码实现分成好多种层级,有的代码只使用标准库实现,有的代码基于其它库实现,有的代码直接调用库中现有的实现. 在本文中,按照不同的层级分别实现PCA 对于分类问题基本任务可以描述如下 x11 x12 x ...

  3. Java内省详解

    内省和反射有什么区别: 反射式在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态.  内省机制是通过反射来实现的,BeanIn ...

  4. Monodraw for Mac(基于 ASCII 码设计编辑工具)破解版安装

    1.软件简介    Monodrawp 是 macOS 系统上一款专为 Mac 设计的强大的 ASCII 码设计编辑器,纯文本历经几十年而不衰.Monodraw for mac 可以创建基于文本的艺术 ...

  5. mysqlcheck与myisamchk的区别

    mysqlcheck和myisamchk都可以用来检测和修复表.(主要是MyISAM表)但是也有以下不同点:1.都可以检查.分析和修复myisam表.但是mysqlcheck也可以检查.分析innod ...

  6. CentOS7中systemctl的使用与CentOS6中service的区别

    https://blog.csdn.net/u012834750/article/details/80501440 从CentOS 7.x开始,CentOS开始使用systemd服务来代替daemon ...

  7. 6.翻译系列:EF 6 Code-First中数据库初始化策略(EF 6 Code-First系列)

    原文链接:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-firs ...

  8. elasticsearch中 refresh 和flush区别【转】

    elasticsearch中有两个比较重要的操作:refresh 和 flush refresh操作 当我们向ES发送请求的时候,我们发现es貌似可以在我们发请求的同时进行搜索.而这个实时建索引并可以 ...

  9. JVM——垃圾回收(GC)

    GC简单介绍 java语言执行在java虚拟机(jvm)上.为了解决有限的空间和性能的保证这个矛盾体,jvm所具备的GC能力.能够有效的清除不用的对象.使空间的利用更加合理.以下介绍该机制的原理. 推 ...

  10. hive表增量抽取到mysql(关系数据库)的通用程序(三)

    hive表增量抽取到oracle数据库的通用程序(一) hive表增量抽取到oracle数据库的通用程序(二) 这几天又用到了该功能了,所以又改进了一版,增加了全量抽取和批量抽取两个参数.并且可以设置 ...