P2894 [USACO08FEB] Hotel G P3071 [USACO13JAN] Seating G

news/2025/1/8 19:22:26/文章来源:https://www.cnblogs.com/LG017/p/18658151

P2894 [USACO08FEB] Hotel G

P3071 [USACO13JAN] Seating G

题目描述

第一行输入 \(n,m\)\(n\) 代表有 \(n\) 个房间 \((1\leq n \leq 50,000)\),编号为 \(1 \sim n\),开始都为空房,\(m\) 表示以下有 \(m\) 行操作 \((1\leq m < 50,000)\),以下每行先输入一个数 \(i\) ,表示一种操作:

\(i\)\(1\),表示查询房间,再输入一个数 \(x\),表示在 \(1,2,...,n\) 房间中找到长度为 \(x\) 的连续空房,输出连续 \(x\) 个房间中左端的房间号,尽量让这个房间号最小,若找不到长度为 \(x\) 的连续空房,输出 \(0\)。若找得到,在这 \(x\) 个空房间中住上人。

\(i\)\(2\),表示退房,再输入两个数 \(x,y\) 代表房间号 \(x \sim x+y-1\) 退房,即让房间为空。

你需要对每个输入 \(1\) 输出对应的答案。

Solution:

细节有点多的线段树题。维护一下区间子段和,然后查询的时候由于它寻问的是所有满足条件的区间中左端点的最小值,所以我们在查询时应该取区间的最大子段和的起点 \(t[x].pos\) ,中间两端合并的起点 \(mid-t[ls].rmx+1\) 来更新答案,然后如果左子树满足条件的话就查询左子树,反之查询右子树。如果区间的最大子段和 \(t[x].mx<k\) 的话就直接返回。

然后注意一下pushdownd的细节就可以 AC 本题

Code:

#include<bits/stdc++.h>
const int N=4e5+5;
const int inf=1e9;
using namespace std;
int n,m,cnt,rt;
int a[N];
map<int,int> Map;
//Segment_Tree
struct Tree{int lmx,rmx,mx,pos,tag;int ls,rs;
}t[N<<4];
#define ls t[x].ls
#define rs t[x].rs
void add(int &x,int l,int r)
{if(x)return ;x=++cnt;t[x].lmx=t[x].rmx=t[x].mx=r-l+1;t[x].pos=l;
}
void pushdown(int x,int l,int r)
{if(!t[x].tag||l==r)return ;int mid=l+r>>1;if(!ls)add(ls,l,mid);if(!rs)add(rs,mid+1,r);if(t[x].tag==1){t[x].tag=0;t[ls].tag=t[rs].tag=1;t[ls].lmx=t[ls].rmx=t[ls].mx=0;t[rs].lmx=t[rs].rmx=t[rs].mx=0;t[ls].pos=t[rs].pos=inf;}if(t[x].tag==-1){t[x].tag=0;t[ls].tag=t[rs].tag=-1;t[ls].lmx=t[ls].rmx=t[ls].mx=mid-l+1;t[rs].lmx=t[rs].rmx=t[rs].mx=r-mid;t[ls].pos=l;t[rs].pos=mid+1;}}
void push_up(int x,int l,int r)
{int mid=l+r>>1;t[x].lmx=t[ls].lmx+ (t[ls].mx==(mid-l+1) ? t[rs].lmx : 0);t[x].rmx=t[rs].rmx+ (t[rs].mx==(r-mid)   ? t[ls].rmx : 0);t[x].mx=0;t[x].pos=inf;if(t[ls].mx>t[x].mx){t[x].mx=t[ls].mx;t[x].pos=t[ls].pos;}if(t[ls].rmx+t[rs].lmx==t[x].mx){t[x].pos=min(t[x].pos,mid-t[ls].rmx+1);}if(t[ls].rmx+t[rs].lmx>t[x].mx){t[x].mx=t[ls].rmx+t[rs].lmx;t[x].pos=mid-t[ls].rmx+1;}if(t[rs].mx>t[x].mx){t[x].mx=t[rs].mx;t[x].pos=t[rs].pos;}
}
void upd(int &x,int l,int r,int L,int R,int k)
{if(!x)add(x,l,r);if(L<=l&&r<=R){if(k){t[x].lmx=t[x].rmx=t[x].mx=r-l+1;t[x].pos=l;t[x].tag=-1;}else{t[x].lmx=t[x].rmx=t[x].mx=0;t[x].tag=1;t[x].pos=inf;}return ;}int mid=l+r>>1;add(ls,l,mid);add(rs,mid+1,r);pushdown(x,l,r);if(L<=mid)upd(ls,l,mid,L,R,k);if(mid<R) upd(rs,mid+1,r,L,R,k);push_up(x,l,r);
}
int tag=0;
void query(int x,int l,int r,int k,int &res)
{if(t[x].mx<k)return ;int mid=l+r>>1;res=min(res,t[x].pos);//if(t[x].pos==178)cout<<"query:"<<x<<":"<<t[x].pos<<" "<<l<<" "<<r<<" "<<t[ls].lmx<<" "<<t[ls].mx<<" : "<<t[rs].rmx<<" "<<t[rs].mx<<"\n";pushdown(x,l,r);//if(mid-t[ls].rmx+1==178)cout<<"query:"<<t[x].pos<<" "<<l<<" "<<r<<" "<<t[ls].lmx<<" "<<t[ls].mx<<" : "<<t[rs].rmx<<" "<<t[rs].mx<<"\n";if(t[ls].rmx+t[rs].lmx>=k){res=min(res,mid-t[ls].rmx+1);}if(t[ls].mx>=k){query(ls,l,mid,k,res);}if(t[ls].mx<k&&t[rs].mx>=k){query(rs,mid+1,r,k,res);}
}
void work()
{cin>>n>>m;add(rt,1,n);for(int i=1,k,l,r;i<=m;i++){scanf("%d",&k);if(k==1){tag++;scanf("%d",&r);//cout<<"k="<<r<<"\n";if(t[rt].mx<r){printf("%d\n",0);continue;}l=inf;query(rt,1,n,r,l);r+=l-1;upd(rt,1,n,l,r,0);//cout<<"book:"<<l<<" "<<r<<"\n";printf("%d\n",l);}else{scanf("%d%d",&l,&r);r+=l-1;upd(rt,1,n,l,r,1);//cout<<"exit:"<<l<<" "<<r<<"\n";}}
}
int main()
{//freopen("P2894_5.in","r",stdin);freopen("P2894.out","w",stdout);work();return 0;
}

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

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

相关文章

城市生命线安全管理:数据要素整合与场景应用实践

城市生命线工程是确保城市正常运行和居民安全生活的关键基础设施,涉及供水、排水、燃气、电力等多个方面。随着信息技术的发展,特别是大数据、物联网、人工智能等技术的应用,城市生命线数据要素与场景应用的深度融合成为提升城市治理能力的重要途径。数据要素的重要性城市生…

SqlSugar入门教程:连接,增、删、改、查

原文链接:https://blog.csdn.net/zls365365/article/details/131199132 第一步,自然是新建一个项目,控制台什么都可以。因为我还没想好怎么做一个完整的项目,那暂且用一个控制台举例吧。 下面自然是从NuGet安装sqlsugar了。注意鉴别需要安装的版本,我这里是安装sqlsugarc…

env(safe-area-inset-bottom) 兼容写法

先看下兼容性:可以看到 @supports 兼容性很好,所以使用 @supports 做兼容是个不错的选择。 例:@supports (padding-bottom: env(safe-area-inset-bottom)) or(padding-bottom: constant(safe-area-inset-bottom)) {.your-dom {padding-bottom: constant(safe-area-inset-bot…

工业采集系统-天然气计量仪表费用二次计算

1、在“驱动管理->中间件驱动”中添加NaturalGasCalculation.drive。2、在设备配置中,添加采集设备,假设采集到的天然气费用因子为D1.F1,充值金额因子为D1.F2,要求计算的天然气使用体积因子为D1.F3。3、在“系统功能->中间件”中添加一个天然气费用计算中间件,配置内…

SQL优化有绝招,使用DAS提升工作效率!完成任务可领取保暖手套!

​「使用DAS实现数据库SQL优化」活动上线了! 数据库自治服务(Database Autonomy Service,简称DAS)是一种基于机器学习和专家经验实现数据库自感知、自修复、自优化、自运维及自安全的云服务。数据库自治服务DAS支持自动SQL优化,相比传统的优化方式,能够自动识别问题SQL,…

类关系图

本文描述了面向对象设计中类与类之间的五种关系,并对这五种关系从耦合程度、语义和方向上进行了比较。类关系图

特种作业操作(低压电工)实操考试资料整理

为啥去考 在B站关注城阳电工电路等赛博电工师傅们已经有一段时间了,我很喜欢看这些师傅们解决生活中的、生产上的各种电气问题,2023年春天就想去报名学,但是那时候学业很繁忙,而初证又需要去线下学习一段时间。到2024年11月发现自己这段时间突然有空,就尽快找了一家机构报…

AutoGen入门-让两个AI自行聊天完成任务

AutoGen介绍 AutoGen 是一个开源编程框架,用于构建 AI 代理并促进多个代理之间的合作以解决问题。AutoGen 旨在提供一个易于使用和灵活的框架,以加速代理型 AI 的开发和研究,就像 PyTorch 之于深度学习。它提供了诸如代理之间可以对话、LLM 和工具使用支持、自主和人机协作工…

Centos7 安装redis教程

步骤一:安装gcc依赖检查gcc是否已经安装,命令:gcc -v,出现下图说明已经安装由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装yum install -y gcc步骤二:下载redis安装包 https://download.redis.io/relea…

【编码】如何实现一套自定义网络协议?

前言 下文介绍的自定义协议仅作为学习示例,纯粹是玩具项目,没有实际可用性。无需过度关注和讨论其合理性 进行通信的双方是谁? 常见的模型 客户端-服务器,例如HTTP协议,浏览器<=>Web服务器。 中转站模型,如MQTT协议,应用服务<=>中转站<=>硬件客户端 对…

记录一个使用VsCode来ssh的问题(已经打开了ssh的一个文件夹路径,怎么新开一个文件夹路径)

一、操作 使用快捷键 Ctrl+Shift+P(Windows) 或 Cmd+Shift+P (Mac)打开 命令面板 然后输入: File:Open Folder之后就可以选项新的路径打开了。。。没想到我被这个卡了好久,有点无语。