Code:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 200000+5;
int n,m,k;
struct Segment_Tree{
int lazy,left,right,maxv;
}Seg[N<<2];
inline void push_down(int o,int l,int r)
{
if(Seg[o].lazy == -1 || l==r)return;
int mid = (l+r)>>1;
int lz = Seg[o].lazy, ls=o<<1, rs=(o<<1)|1;
Seg[ls].lazy = Seg[rs].lazy = lz;
Seg[ls].maxv = lz==0 ? mid-l+1: 0;
Seg[rs].maxv = lz==0 ? r-mid: 0;
Seg[ls].left = Seg[ls].right = Seg[ls].maxv;
Seg[rs].left = Seg[rs].right = Seg[rs].maxv;
Seg[o].lazy = -1;
}
inline void update_seg(int o,int l,int r)
{
int mid = (l+r)>>1, ls=o<<1, rs=(o<<1)|1;
Seg[o].maxv = max(Seg[ls].maxv, Seg[rs].maxv);
Seg[o].maxv = max(Seg[o].maxv, Seg[ls].right+Seg[rs].left);
Seg[o].left = Seg[ls].maxv == mid-l+1 ? Seg[ls].maxv+Seg[rs].left : Seg[ls].left;
Seg[o].right = Seg[rs].maxv == r-mid ? Seg[rs].maxv+Seg[ls].right: Seg[rs].right;
}
void build_Tree(int l,int r,int o){
if(l>r)return;
if(l==r)
{
Seg[o].left = Seg[o].right = Seg[o].maxv = 1;
Seg[o].lazy = -1;
return;
}
int mid = (l+r)>>1, ls=o<<1, rs=(o<<1)|1;
build_Tree(l,mid,ls);
build_Tree(mid+1,r,rs);
update_seg(o,l,r);
Seg[o].lazy = -1;
}
void update(int L,int R,int l,int r,int val,int o){
if(L>R)return;
if(L>=l&&R<=r)
{
Seg[o].lazy = val;
Seg[o].maxv = (val==0)?R-L+1: 0;
Seg[o].left = Seg[o].right = Seg[o].maxv;
return;
}
push_down(o,L,R);
int mid = (L+R)>>1,ls=o<<1, rs=(o<<1)|1;
if(l<=mid) update(L,mid,l,r,val,ls);
if(r>mid) update(mid+1,R,l,r,val,rs);
update_seg(o,L,R);
}
int query(int o,int l,int r){
int mid=(l+r)>>1, ls=o<<1, rs=(o<<1)|1, ans;
push_down(o,l,r);
if(Seg[o].left >= k)
ans = l;
else if(Seg[ls].maxv >=k )
ans = query(ls,l,mid);
else if(Seg[ls].right+Seg[rs].left >= k)
ans = mid+1-Seg[ls].right;
else
ans = query( rs ,mid+1,r);
update_seg(o,l,r);
return ans;
}
inline int solve_1(){
if(Seg[1].maxv < k)return 0;
return query(1,1,n);
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
scanf("%d%d",&n,&m);
build_Tree(1,n,1);
while(m--)
{
int op,x,y;
scanf("%d%d",&op,&x);
if(op==1)
{
k=x;
int ans=solve_1();
printf("%d\n",ans);
if(ans!=0)update(1,n,ans,ans+k-1,1,1);
}
if(op==2)
{
scanf("%d",&y);
update(1,n,x,x+y-1,0,1);
}
}
return 0;
}

  

洛谷P2894 [USACO08FEB]酒店Hotel_区间更新_区间查询的更多相关文章

  1. 洛谷 P2894 [USACO08FEB]酒店Hotel-线段树区间合并(判断找位置,不需要维护端点)+分治

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

  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 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultur ...

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

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

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

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

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

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

  7. 洛谷 P2894 [USACO08FEB]酒店

    题目描述 用线段树维护三个值:区间最长空位长度,从左端点可以延伸的最长空位长度,从右端点可以延伸的最长空位长度. #include<complex> #include<cstdio& ...

  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

    P2894 [USACO08FEB]酒店Hotel 参考样例,第一行输入n,m ,n代表有n个房间,编号为1---n,开始都为空房,m表示以下有m行操作,以下 每行先输入一个数 i ,表示一种操作: ...

随机推荐

  1. python 用PIL Matplotlib处理图像的基本操作

    在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...

  2. js借助JSONP实现百度搜索框提示效果

    主要借助百度搜索的API,调用时会存在跨域问题,需要通过JSONP来解决这个问题,代码如下(代码中部分使用ES6语法): HTML <input type="text" id ...

  3. HDU 2224 The shortest path

    The shortest path Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. 洛谷 P2534 [AHOI2012]铁盘整理

    P2534 [AHOI2012]铁盘整理 题目描述 输入输出格式 输入格式: 共两行.第一行为铁盘个数N(1<=N<=50),第二行为N个不同的正整数,分别为从上到下的铁盘的半径R.(1& ...

  5. GNUPlot绘制曲线

    发现gnuplot在mac上编译安装相当方便,在线下为了測试java老堆和lucene索引大小,须要绘制两条线,可是直接点连的线很难看,所以后面使用贝塞尔曲线. 脚本例如以下: #! /usr/loc ...

  6. Cocos2d-x3.0RC2 EditBox

    EditBox样例 将例如以下代码拷贝到新建的project中就能看到效果. HelloWorldScene.h #include "cocos2d.h" /*这里要引入头文件*/ ...

  7. 【iOS开发-80】Quartz2D画图简单介绍:直线/圆形/椭圆/方形以及上下文栈管理CGContextSaveGState/CGContextRestoreGState

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2Vpc3ViYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  8. MySQL主从复制和读写分离

    我们知道应用对数据库的訪问通常情况下大部分都是读操作,写仅仅占非常少一部分.因此读写分离(read-write-splitting)能有效减少主库压力,从而解决站点发展过程中遇到的第一次数据库瓶颈. ...

  9. Linux - 控制台界面,虚拟界面,字符界面

    tty控制台终端. pts虚拟终端. tty1 图形界面. tty2 字符界面. Ctrl+Alt+F2-6 在字符界面下,通过Alt+F2 切换回来.或者切换到其他的字符界面. Alt+F2 pts ...

  10. poj 3259-- Wormholes(SPFA)

                                                                                                         ...