[题解](线段树最大连续子段和)POJ_3667_Hotel
题意: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的更多相关文章
- POJ2182题解——线段树
POJ2182题解——线段树 2019-12-20 by juruoOIer 1.线段树简介(来源:百度百科) 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线 ...
- codedecision P1112 区间连续段 题解 线段树
题目描述:https://www.cnblogs.com/problems/p/P1112.html 题目链接:http://codedecision.com/problem/1112 线段树区间操作 ...
- POJ.2750.Potted Flower(线段树 最大环状子段和)
题目链接 /* 13904K 532ms 最大 环状 子段和有两种情况,比如对于a1,a2,a3,a4,a5 一是两个端点都取,如a4,a5,a1,a2,那就是所有数的和减去不选的,即可以计算总和减最 ...
- 理想乡题解 (线段树优化dp)
题面 思路概述 首先,不难想到本题可以用动态规划来解,这里就省略是如何想到动态规划的了. 转移方程 f[i]=min(f[j]+1)(max(i-m,0)<=j<i 且j符合士兵限定) 注 ...
- ZOJ 2301 / HDU 1199 Color the Ball 离散化+线段树区间连续最大和
题意:给你n个球排成一行,初始都为黑色,现在给一些操作(L,R,color),给[L,R]区间内的求染上颜色color,'w'为白,'b'为黑.问最后最长的白色区间的起点和终点的位置. 解法:先离散化 ...
- luoguP5105 不强制在线的动态快速排序 [官方?]题解 线段树 / set
不强制在线的动态快速排序 题解 算法一 按照题意模拟 维护一个数组,每次直接往数组后面依次添加\([l, r]\) 每次查询时,暴力地\(sort\)查询即可 复杂度\(O(10^9 * q)\),期 ...
- [bzoj2752]高速公路 题解(线段树)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2102 Solved: 887[Submit] ...
- POJ 3468 A Simple Problem with Integers(详细题解) 线段树
这是个线段树题目,做之前必须要有些线段树基础才行不然你是很难理解的. 此题的难点就是在于你加的数要怎么加,加入你一直加到叶子节点的话,复杂度势必会很高的 具体思路 在增加时,如果要加的区间正好覆盖一个 ...
- codedecision P1113 同颜色询问 题解 线段树动态开点
题目描述:https://www.cnblogs.com/problems/p/11789930.html 题目链接:http://codedecision.com/problem/1113 这道题目 ...
随机推荐
- windows下面的python的MySQLdb环境安装
什么是MySQLdb? MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的. 如何安装MySQ ...
- C++函数重载详解
我们在开瓶瓶罐罐的时候,经常会遭遇因各种瓶口规格不同而找不到合适的工具的尴尬.所以有时候就为了开个瓶,家里要备多种规格的开瓶器.同样是开个瓶子嘛,何必这么麻烦?于是有人发明了多功能开瓶器,不管啤酒瓶汽 ...
- pthread_detach()函数
创建一个线程默认的状态是joinable. 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出状态码). 所以创建线程者应该调 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- 使用Anthem.NET 1.5中的FileUpload控件实现Ajax方式的文件上传
Anthem.NET刚刚发布了其最新的1.5版本,其中很不错的一个新功能就是对文件上传功能的Ajax实现.本文将简要介绍一下该功能的使用方法. Anthem.NET的下载与安装 Anthem.NET可 ...
- Linux 下使用 ssh 登录局域网其他电脑的方法
Linux 下使用 ssh 登录局域网其他电脑的方法 首先查看电脑是否安装 ssh 客户端,如果没有执行下面命令安装客户端. sudo apt-get install openssh-client s ...
- Erlang generic standard behaviours -- gen_server noblock call
在Erlang 系统中,经常需要gen_server 进程来处理共享性的数据,也就是总希望一个gen_server 进程来为多个普通进程提供某种通用性的服务,这也是gen_server 设计的初衷.但 ...
- HDOJ1151有向图最小路径覆盖
//有向图最小路径覆盖:从某一点出发沿着有向路径,不走回路,能将所有的结点遍历. #include<iostream> #include<cstdio> #include< ...
- 游戏中的 2D 可见性
转自:http://www.gameres.com/469173.html 拖动圆点转一圈,看看玩家都能看到些什么: 这个算法也能计算出给定光源所照亮的区域.对每条光线,我们可以构建出被照亮区域的光线 ...
- ffmpeg+HLS实现直播与回放
Nginx配置视频服务器 server { listen ; server_name localhost; location /hls{ add_header Access-Control-Allow ...