bzoj 1593: [Usaco2008 Feb]Hotel 旅馆【线段树】
参考:https://blog.csdn.net/u010336344/article/details/53034372
神一样的线段树
线段树上维护:ll从左开始最长空段;rr从右开始最长空段;len区间中最长空段;tg:-1不全是空的,0区间内全是空的,1区间内全是满的;lz下传标记:-1没标记,1下传满的,0下传空的
修改的时候,修改到一整个区间,就把lz和tg改了,ll、rr、len全改成r-l+1或者0
然后下传标记的时候同上
向上合并的时候,先把左右区间的ll、rr穿给当前区间,然后根据左右区间的tg是否为0(全空)来扩大当前区间的ll、rr;tg根据左右区间tg更改;len从左区间len、右区间len和左区间rl+右区间ll中取max
查询的时候优先查左边即可,像二分一样在树上跳
#include<iostream>
#include<cstdio>
using namespace std;
const int N=100005;
int n,m;
struct xds
{
int l,r,ll,rl,tg,len,lz;
}t[N<<1];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void pd(int ro)
{
if(t[ro].lz!=-1)
{
if(t[ro].lz==1)
{
t[ro<<1].rl=t[ro<<1].ll=t[ro<<1].len=0;
t[ro<<1|1].rl=t[ro<<1|1].ll=t[ro<<1|1].len=0;
}
else
{
t[ro<<1].rl=t[ro<<1].ll=t[ro<<1].len=t[ro<<1].r-t[ro<<1].l+1;
t[ro<<1|1].rl=t[ro<<1|1].ll=t[ro<<1|1].len=t[ro<<1|1].r-t[ro<<1|1].l+1;
}
t[ro<<1].tg=t[ro<<1|1].tg=t[ro].tg;
t[ro<<1].lz=t[ro<<1|1].lz=t[ro].lz;
t[ro].lz=-1;
}
}
void ud(int ro)
{
if(t[ro<<1].tg==t[ro<<1|1].tg)
t[ro].tg=t[ro<<1].tg;
else
t[ro].tg=-1;
t[ro].ll=t[ro<<1].ll;
t[ro].rl=t[ro<<1|1].rl;
if(!t[ro<<1].tg)
t[ro].ll+=t[ro<<1|1].ll;
if(!t[ro<<1|1].tg)
t[ro].rl+=t[ro<<1].rl;
t[ro].len=max(max(t[ro<<1].len,t[ro<<1|1].len),t[ro<<1].rl+t[ro<<1|1].ll);
}
void build(int ro,int l,int r)
{
t[ro].l=l,t[ro].r=r,t[ro].len=t[ro].ll=t[ro].rl=r-l+1,t[ro].lz=-1;
if(l==r)
return;
int mid=(l+r)>>1;
build(ro<<1,l,mid);
build(ro<<1|1,mid+1,r);
}
void update(int ro,int l,int r,int k)
{
if(t[ro].l==l&&t[ro].r==r)
{
if(k)
t[ro].rl=t[ro].ll=t[ro].len=0;
else
t[ro].rl=t[ro].ll=t[ro].len=r-l+1;
t[ro].tg=t[ro].lz=k;
return;
}
pd(ro);
int mid=(t[ro].l+t[ro].r)>>1;
if(r<=mid)
update(ro<<1,l,r,k);
else if(l>mid)
update(ro<<1|1,l,r,k);
else
update(ro<<1,l,mid,k),update(ro<<1|1,mid+1,r,k);
ud(ro);
}
int ques(int ro,int k)
{
int re=-1;
while(t[ro].l&&t[ro].len>=k)
{
if(t[ro].ll>=k)
{
re=t[ro].l;
break;
}
if(t[ro<<1].len>=k)
ro<<=1;
else
{
if(t[ro<<1].rl!=0&&t[ro<<1].rl+t[ro<<1|1].ll>=k)
{
re=t[ro<<1].r-t[ro<<1].rl+1;
break;
}
else
ro=ro<<1|1;
}
}
return re;
}
int main()
{
n=read(),m=read();
build(1,1,n);
while(m--)
{
int o=read();
if(o==1)
{
int x=read(),now=ques(1,x);
if(now!=-1)
{
printf("%d\n",now);
update(1,now,now+x-1,1);
}
else
puts("0");
}
else
{
int x=read(),y=read();
update(1,x,x+y-1,0);
}
}
return 0;
}
bzoj 1593: [Usaco2008 Feb]Hotel 旅馆【线段树】的更多相关文章
- BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆 [线段树]
传送门 题意: 操作1:找长为$len$的空区间并填满,没有输出$0$ 操作2:将$[l,r]$之间的区间置空 我真是太弱了这种线段树还写了一个半小时,中间为了查错手动模拟了$30min$线段树操作, ...
- bzoj1593 [Usaco2008 Feb]Hotel 旅馆(线段树)
1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 758 Solved: 419[Submit ...
- 【bzoj1593】[Usaco2008 Feb]Hotel 旅馆 线段树区间合并
题目描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...
- BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆
Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 &l ...
- 1593: [Usaco2008 Feb]Hotel 旅馆
1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 391 Solved: 228[Submit ...
- 【BZOJ】1593: [Usaco2008 Feb]Hotel 旅馆
[算法]线段树(经典线段树上二分) [题意]n个房间,m个询问,每次订最前的连续x个的空房间,或退订从x开始y个房间,求每次订的最左房间号. [题解]关键在于找连续x个空房间,经典二分. 线段树标记s ...
- 线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel
题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间 ...
- 【最长连续零 线段树】bzoj1593: [Usaco2008 Feb]Hotel 旅馆
最长连续零的线段树解法 Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负 责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大 ...
- BZOJ1593 [Usaco2008 Feb]Hotel 旅馆
裸上线段树,就是记的东西有点多... 每个点记区间左端最长0,右端最长0,中间最长0,和tag表示是否全为0/1 直接更新就好,查询的时候先查左儿子,然后查中间,最后查右儿子... /******** ...
随机推荐
- prometheus监控linux系统
安装node exporter 创建Systemd服务 #vim /etc/systemd/system/node_exporter.service[Unit]Description=mysql_ex ...
- CodeForces - 425E Sereja and Sets 题解
题目大意: 我们有一个集合 S,其中包含了 m 个不完全相同的区间[l1,r1],[l2,r2]…[lm,rm] (1≤li≤ri≤n,li,ri 都为整数). 定义 f(S)=k,表示集合 S 中能 ...
- [codeforces494B]Obsessive String
[codeforces494B]Obsessive String 试题描述 Hamed has recently found a string t and suddenly became quite ...
- 【bzoj1922】[Sdoi2010]大陆争霸 - STL - dijkstra
信仰斯普林·布拉泽的克里斯国教徒. 幻想历 8012年 3月2日,位于杰森国东部小镇神谕镇的克里斯国教徒发动 起义. 幻想历 8012年 3月7日,神谕镇的起义被杰森国大军以残酷手段镇压. 幻想历 8 ...
- Xcode4.5.1破解iOS免证书开发真机调试与ipa发布
开发环境使用Mac OSX Mountain Lion 10.8 + Xcode 4.5.1,iOS设备需要越狱并从Cydia安装AppSync.Xcode4.5.1的安装破解详细步骤如下: 第一步, ...
- 建造高塔(codevs 1689)
题目描述 Description n有n种石块,石块能无限供应.每种石块都是长方体,其中第i种石块的长.宽.高分别为li.wi.hi.石块可以旋转,使得其中两维成为长度和宽度,第三维成为高度.如果要把 ...
- 贪吃的九头龙(tyvj P1523)
T2 .tyvj P1523贪吃的九头龙 描述 传说中的九头龙是一种特别贪吃的动物.虽然名字叫“九头龙”,但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于 ...
- Android 4.4.2上与BLE 蓝牙锁设备的通讯
Android从4.3(Api level 18)开始支持BLE的开发,本文记录了Android 4.4.2设备与BLE设备通讯的流程. 权限需求: <uses-permission andro ...
- HDU 1754_I Hate It
[题意]给定区间求最大值 [分析]线段树单点更新 [代码] #include<cstdio> #include<iostream> using namespace std; c ...
- 【Spark】Spark容错机制
引入 一般来说,分布式数据集的容错性有两种方式:数据检查点和记录数据的更新. 面向大规模数据分析,数据检查点操作成本非常高,须要通过数据中心的网络连接在机器之间复制庞大的数据集,而网络带宽往往比内存带 ...