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

题面: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=50000+5,maxm=50000+5;
 7 int N,M,o,D,X,ans;
 8 inline int rd(){
 9     int x=0;char c=getchar();
10     while(c<'0'||c>'9')c=getchar();
11     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
12     return x;
13 }
14 struct Tree{
15     int l,r,lazy,h_,t_,mx;
16 }t[maxn<<2];
17 inline void Pushup(int x){
18     int ls=x<<1,rs=x<<1|1;
19     if(t[ls].r-t[ls].l+1==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+1==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=-1;
27     if(l==r){
28         t[x].h_=t[x].t_=t[x].mx=1;
29         return;
30     }
31     int mid=(l+r)>>1;
32     Build(x<<1,l,mid);Build(x<<1|1,mid+1,r);
33     Pushup(x);
34     return;
35 }
36 inline void Pushdown(int x){
37     if(t[x].lazy>=0){
38         int k=t[x].lazy,ls=x<<1,rs=x<<1|1;t[x].lazy=-1;
39         if(k==1){
40             t[ls].h_=t[ls].t_=t[ls].mx=0;
41             t[rs].h_=t[rs].t_=t[rs].mx=0;
42         }
43         else{
44             t[ls].h_=t[ls].t_=t[ls].mx=t[ls].r-t[ls].l+1;
45             t[rs].h_=t[rs].t_=t[rs].mx=t[rs].r-t[rs].l+1;
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<<1,rs=x<<1|1,l=t[x].l,r=t[x].r;
53     if(r-l+1==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_+1);
57     if(t[rs].mx>=d)return Solve(rs,d);
58     return 0;
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==1)t[x].h_=t[x].t_=t[x].mx=0;
64         else t[x].h_=t[x].t_=t[x].mx=r-l+1;
65         t[x].lazy=o;
66         return;
67     }
68     int mid=(l+r)>>1,ls=x<<1,rs=x<<1|1;
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[12];int len=0;
77     for(;x;x/=10)a[len++]=x%10;
78     if(!len)putchar('0');
79     else while(len)putchar(a[--len]+'0');
80     putchar('\n');
81 }
82 int main(){
83     N=rd();M=rd();
84     Build(1,1,N);
85     while(M--){
86         o=rd();
87         if(o==1){
88             D=rd();
89             ans=Solve(1,D);
90             write(ans);
91             if(ans)Update(1,ans,ans+D-1,1);//1表示有住人 
92         }
93         else{
94             X=rd();D=rd();
95             Update(1,X,X+D-1,0);
96         }
97     }
98     return 0;
99 }

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


By:AlenaNuna

 

转载于:https://www.cnblogs.com/AlenaNuna/p/10357986.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内存管理详解

前一段时间看了《深入理解Linux内核》对其中的内存管理部分花了不少时间&#xff0c;但是还是有很多问题不是很清楚&#xff0c;最近又花了一些时间复习了一下&#xff0c;在这里记录下自己的理解和对Linux中内存管理的一些看法和认识。 我比较喜欢搞清楚一个技术本身的发展历程…

JavaOne 2016 Essentials:7个您不容错过的事件和会话

参加JavaOne吗&#xff1f; 确保您不会错过这些活动 又到了每年的这个时候。 旧金山一年一度的Java假期即将来临&#xff0c;全市发生了超过400场会议和活动。 由于所有这些内容和新体验都一次发生&#xff0c;因此很容易就无法跟踪正在发生的事情。 在这篇文章中&#xff0c…

任务18:控制反转

控制反转 实现你的依赖&#xff0c;采用什么依赖&#xff0c;不由你自己决定&#xff0c;这个控制交给IOC容器。 这里所有的实现都不由你自己决定&#xff0c;我们只需要传给你就可以了。谁来传呢&#xff1f;容器来传给他 内存的Repository&#xff0c;这里实现的比较简单。 这…

程序的重定位问题(程序装入)

在多道程序环境下&#xff0c;要使程序运行&#xff0c;必须先为程序创建进程。而创建进程的第一件事就是&#xff1a;将程序和数据装入内存。如何将一个用户源程序变成可在内存中执行的程序&#xff0c;通常都要进过几个步骤&#xff1a;1.编译&#xff1a;由compiler将源程序…

matlab频响优化,MATLAB中关于频响图函数最优化的程序问题

我是一名大四的学生,现在正在做毕业设计,因MATLAB从未学过,也是边学边做,我需要求出IGv函数的频率响应图,因IGv的表达式很复杂,这里我没列出,在下面的程序中有的,以下是我的程序,请高手帮我看看程序有什么问题哈,万分感谢!%%igmax is global maximumIgmin1000000000;%%exmperim…

杂项-事务:OLTP(联机事务处理过程)

ylbtech-杂项-事务&#xff1a;OLTP&#xff08;联机事务处理过程&#xff09;On-Line Transaction Processing联机事务处理过程(OLTP)也称为面向交易的处理过程&#xff0c;其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理&#xff0c;并在很短的时间内给出处理…

dvd管理器java,简单DVD管理-java练习题

问题描述为某音像店开发一个迷你DVD管理器&#xff0c;最多可存6张DVD,实现碟片的管理。管理器具备的功能主要有&#xff1a;1、查看DVD信息。菜单选择查看功能&#xff0c;展示DVD的信息。2、新增DVD信息选择新增功能&#xff0c;根据提示输入新增的DVD名称&#xff0c;添加到…

从hello world 说程序运行机制

开篇 学习任何一门编程语言&#xff0c;都会从hello world 开始。对于一门从未接触过的语言&#xff0c;在短时间内我们都能用这种语言写出它的hello world。 然而&#xff0c;对于hello world 这个简单程序的内部运行机制&#xff0c;我相信还有很多人都不是很清楚。hello wor…

webapp支持什么数据库_数据库和Webapp安全

webapp支持什么数据库威胁模型 这是根据我网站上的快速参考页松散地讨论数据库和webapp安全的问题。 该页面变得笨拙&#xff0c;并且使读者无法轻松地与我或其他人进行交互。 威胁模型 所有安全分析必须从检查威胁模型开始。 威胁模型要求您回答四个问题&#xff1a; 我要…

开发进度3

对于将软件变为小程序上&#xff0c;还是无法成功&#xff0c;需要继续寻找相关资源学习 转载于:https://www.cnblogs.com/NCLONG/p/10419840.html

matlab排序函数 下标,MATLAB排序函数 - 小众知识

>> Amagic(3)A 8 1 63 5 74 9 2>> sort(A)ans 3 1 24 5 68 9 7>> sort(A,1)ans 3 1 24 5 68 9 7>> sort(A,2)ans 1 6 83 5 72 4 9Matlab中给一维向量排序是使用sort函数&#xff1a;sort(A)&#xff0c;排序是按升序进行的&#xff0c;其中A为待排序的…

可执行程序加载到内存的过程

在linux中&#xff0c;程序的加载&#xff0c;涉及到两个工具&#xff0c;linker 和loader。Linker主要涉及动态链接库的使用&#xff0c;loader主要涉及软件的加载。 1、 exec执行一个程序 2、 elf为现在非常流行的可执行文件的格式&#xff0c;它为程序运行划分了两个段&…

使用Apache Storm和Apache Ignite进行复杂的事件处理(CEP)

在本文中&#xff0c; “使用Apache Ignite进行高性能内存计算”一书的作者将讨论使用Apache Strom和Apache Ignite进行复杂的事件处理。 本文的一部分摘自 书 。 术语“复杂事件处理”或CEP没有广泛或高度接受的定义。 Wikipedia的以下引用可以简要描述什么是复杂事件处理&a…

【BZOJ5213】[ZJOI2018]迷宫(神仙题)

【BZOJ5213】[ZJOI2018]迷宫&#xff08;神仙题&#xff09; 题面 BZOJ洛谷 题解 首先可以很容易的得到一个\(K\)个点的答案。 构建\(K\)个点分别表示\(mod\ K\)的余数。那么点\(i\)的出边\(j\)指向\(i*mj\ mod\ K\)。容易证明这样子一定是可行的。 但是我们显然还有一部分点是…

php 合并两个数组并去重,合并两个数组 以KEY 作为键

$a array(array(ID> 2));$b array(array(ID> 5656));print_r($r);//合并两个数组 以ID值 作为键function mergeById(&$arr1,&$arr2, $keyID){$arr array();foreach($arr1 as $v) {$arr[$v[$key]] $v;}foreach($arr2 as $v){$arr[$v[$key]] isset($arr[$v[$key…

进程的创建与可执行程序的加载

一、进程试探 编程实现一个简单的shell程序 点击(此处)折叠或打开 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<string.h> #include<sys/types.h> #define NUM 1024 int mystrtok(char *argv[], char* string) {/…

chrome面板介绍

Chrome开发者工具详解(1)&#xff1a;Elements、Console、Sources面板 Chrome 开发者工具详解(2)&#xff1a;Network 面板 Chrome开发者工具详解(3)&#xff1a;Timeline面板 Chrome 开发者工具详解(4)&#xff1a;Profiles 面板 Chrome开发者工具详解 (5)&#xff1a;Applica…

菜鸟php ajax,AJAX ASP/PHP

AJAX ASP/PHP 实例AJAX 用于创造动态性更强的应用程序。AJAX ASP/PHP 实例下面的例子将为您演示当用户在输入框中键入字符时&#xff0c;网页如何与 web 服务器进行通信&#xff1a; 请在下面的输入框中键入字母(A - Z)&#xff1a;实例Start typing a name in the input field…

没有系列化导致错误:java.io.NotSerializableException: com.bjpowernode.bean.Team

java.io.NotSerializableException: com.bjpowernode.bean.Team Cause: java.io.NotSerializableException: com.bjpowernode.bean.Player 有一个没有实现接口的转载于:https://www.cnblogs.com/Koma-vv/p/10367855.html

CPU-bound(计算密集型) 和I/O bound(I/O密集型)

I/O bound 指的是系统的CPU效能相对硬盘/内存的效能要好很多&#xff0c;此时&#xff0c;系统运作&#xff0c;大部分的状况是 CPU 在等 I/O (硬盘/内存) 的读/写&#xff0c;此时 CPU Loading 不高。 CPU bound 指的是系统的 硬盘/内存 效能 相对 CPU 的效能 要好很多&#x…