题意:1.求一个最靠左的长x的区间全部为0,并修改为1,输出这个区间的左端点

2.修改一个区间为0

实际上是维护最大连续子段和,原来也写过

大概需要维护一个左/右最大子段和,当前这段最大子段长,再维护一个lazytag

#include<iostream>
#include<cstdio>
#include<cstring>
#define mid (l+r>>1)
#define ls x<<1
#define rs x<<1|1
using namespace std;
const int maxn=;
struct node{
int l,r,mx,tg;//0全空,1全满,-1没有
}t[maxn<<];
//inline void upd(int x,int l,int r){
// t[x].l=t[ls].l;
// t[x].r=t[rs].r;
//// if(t[ls].l==mid-l+1)t[x].l+=t[rs].l;
//// if(t[rs].r==r-mid)t[x].r+=t[ls].r;
// if(t[ls].l==(r-l+1-(r-l+1)/2))t[x].l+=t[rs].l;
// if(t[rs].r==(r-l+1)/2)t[x].r+=t[ls].r;
// t[x].mx=max(max(t[ls].mx,t[rs].mx),t[ls].r+t[rs].l);
//}
//inline void pushdown(int x,int l,int r){
// if(t[x].tg!=-1){
// t[ls].tg=t[rs].tg=t[x].tg;
// t[ls].l=t[ls].r=t[ls].mx=(r-l+1-(r-l+1)/2)*t[x].tg;
// t[rs].l=t[rs].r=t[rs].mx=(r-l+1)/2*t[x].tg;
//// if(t[x].tg==0){
//// t[ls].l=t[ls].r=t[ls].mx=mid-l+1;
//// t[rs].l=t[rs].r=t[rs].mx=r-mid;
//// }
//// else{
//// t[ls].l=t[ls].r=t[ls].mx=0;
//// t[rs].l=t[rs].r=t[rs].mx=0;
//// }
// t[x].tg=-1;
// }
//}
inline void pushdown(int x,int len){
if(t[x].tg!=-){
t[ls].tg=t[rs].tg=t[x].tg;
t[ls].mx=t[ls].l=t[ls].r=t[x].tg*(len-(len>>));
t[rs].mx=t[rs].l=t[rs].r=t[x].tg*(len>>);
t[x].tg=-;
}
}
inline void upd(int x,int len){
t[x].l=t[ls].l;
t[x].r=t[rs].r;
if(t[x].l==len-(len>>))t[x].l+=t[rs].l;
if(t[x].r==(len>>))t[x].r+=t[ls].r;
t[x].mx=max(max(t[ls].mx,t[rs].mx),t[ls].r+t[rs].l);
}
void build(int x,int l,int r){
t[x].l=t[x].r=t[x].mx=r-l+;t[x].tg=-;
if(l==r)return;
build(ls,l,mid);build(rs,mid+,r);
}
void change(int x,int l,int r,int L,int R,int k){
if(L<=l && r<=R){
t[x].l=t[x].r=t[x].mx= k==?:r-l+;
t[x].tg=k;
return;
}
// pushdown(x,l,r);
pushdown(x,r-l+);
if(L<=mid)change(ls,l,mid,L,R,k);
if(R>mid)change(rs,mid+,r,L,R,k);
// upd(x,l,r);
upd(x,r-l+);
}
int query(int x,int l,int r,int k){
if(l==r)return ;
// pushdown(x,l,r);
pushdown(x,r-l+);
if(t[ls].mx>=k)return query(ls,l,mid,k);
else if(t[ls].r+t[rs].l>=k)return mid-t[ls].r+;
else return query(rs,mid+,r,k);
}
int n,m;
int main(){
scanf("%d%d",&n,&m);
build(,,n);
for(int i=,op,x,y;i<=m;i++){
scanf("%d",&op);
if(op==){
scanf("%d",&x);
if(t[].mx<x)printf("0\n");
else{
int pos=query(,,n,x);
printf("%d\n",pos);
change(,,n,pos,pos+x-,);
}
}
else{
scanf("%d%d",&x,&y);
change(,,n,x,x+y-,);
}
}
}

[题解](线段树最大连续子段和)POJ_3667_Hotel的更多相关文章

  1. POJ2182题解——线段树

    POJ2182题解——线段树 2019-12-20 by juruoOIer 1.线段树简介(来源:百度百科) 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线 ...

  2. codedecision P1112 区间连续段 题解 线段树

    题目描述:https://www.cnblogs.com/problems/p/P1112.html 题目链接:http://codedecision.com/problem/1112 线段树区间操作 ...

  3. POJ.2750.Potted Flower(线段树 最大环状子段和)

    题目链接 /* 13904K 532ms 最大 环状 子段和有两种情况,比如对于a1,a2,a3,a4,a5 一是两个端点都取,如a4,a5,a1,a2,那就是所有数的和减去不选的,即可以计算总和减最 ...

  4. 理想乡题解 (线段树优化dp)

    题面 思路概述 首先,不难想到本题可以用动态规划来解,这里就省略是如何想到动态规划的了. 转移方程 f[i]=min(f[j]+1)(max(i-m,0)<=j<i 且j符合士兵限定) 注 ...

  5. ZOJ 2301 / HDU 1199 Color the Ball 离散化+线段树区间连续最大和

    题意:给你n个球排成一行,初始都为黑色,现在给一些操作(L,R,color),给[L,R]区间内的求染上颜色color,'w'为白,'b'为黑.问最后最长的白色区间的起点和终点的位置. 解法:先离散化 ...

  6. luoguP5105 不强制在线的动态快速排序 [官方?]题解 线段树 / set

    不强制在线的动态快速排序 题解 算法一 按照题意模拟 维护一个数组,每次直接往数组后面依次添加\([l, r]\) 每次查询时,暴力地\(sort\)查询即可 复杂度\(O(10^9 * q)\),期 ...

  7. [bzoj2752]高速公路 题解(线段树)

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2102  Solved: 887[Submit] ...

  8. POJ 3468 A Simple Problem with Integers(详细题解) 线段树

    这是个线段树题目,做之前必须要有些线段树基础才行不然你是很难理解的. 此题的难点就是在于你加的数要怎么加,加入你一直加到叶子节点的话,复杂度势必会很高的 具体思路 在增加时,如果要加的区间正好覆盖一个 ...

  9. codedecision P1113 同颜色询问 题解 线段树动态开点

    题目描述:https://www.cnblogs.com/problems/p/11789930.html 题目链接:http://codedecision.com/problem/1113 这道题目 ...

随机推荐

  1. windows下面的python的MySQLdb环境安装

    什么是MySQLdb? MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的. 如何安装MySQ ...

  2. C++函数重载详解

    我们在开瓶瓶罐罐的时候,经常会遭遇因各种瓶口规格不同而找不到合适的工具的尴尬.所以有时候就为了开个瓶,家里要备多种规格的开瓶器.同样是开个瓶子嘛,何必这么麻烦?于是有人发明了多功能开瓶器,不管啤酒瓶汽 ...

  3. pthread_detach()函数

    创建一个线程默认的状态是joinable. 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出状态码). 所以创建线程者应该调 ...

  4. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  5. 使用Anthem.NET 1.5中的FileUpload控件实现Ajax方式的文件上传

    Anthem.NET刚刚发布了其最新的1.5版本,其中很不错的一个新功能就是对文件上传功能的Ajax实现.本文将简要介绍一下该功能的使用方法. Anthem.NET的下载与安装 Anthem.NET可 ...

  6. Linux 下使用 ssh 登录局域网其他电脑的方法

    Linux 下使用 ssh 登录局域网其他电脑的方法 首先查看电脑是否安装 ssh 客户端,如果没有执行下面命令安装客户端. sudo apt-get install openssh-client s ...

  7. Erlang generic standard behaviours -- gen_server noblock call

    在Erlang 系统中,经常需要gen_server 进程来处理共享性的数据,也就是总希望一个gen_server 进程来为多个普通进程提供某种通用性的服务,这也是gen_server 设计的初衷.但 ...

  8. HDOJ1151有向图最小路径覆盖

    //有向图最小路径覆盖:从某一点出发沿着有向路径,不走回路,能将所有的结点遍历. #include<iostream> #include<cstdio> #include< ...

  9. 游戏中的 2D 可见性

    转自:http://www.gameres.com/469173.html 拖动圆点转一圈,看看玩家都能看到些什么: 这个算法也能计算出给定光源所照亮的区域.对每条光线,我们可以构建出被照亮区域的光线 ...

  10. ffmpeg+HLS实现直播与回放

    Nginx配置视频服务器 server { listen ; server_name localhost; location /hls{ add_header Access-Control-Allow ...