[题解](线段树最大连续子段和)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 这道题目 ...
随机推荐
- 常用调试工具gdb,dbx,valgrind介绍一
类UNIX下C/C++开发,代码调试比较麻烦,最原始的加跟踪调试很土,也很费时,特别是一个庞大的项目,代码行数非常大的时候调试起来非常费劲,当core dump时定位也不容易,这里介绍几个常用工具: ...
- Smali文件添加try/catch语句,出现“invalid use of move-exception”异常
插入代码如下: 捕获到以下异常: 2019-03-18 21:09:35.431 8272-8272/com.xxxx.xxxx E/AndroidRuntime: FATAL EXCEPTION: ...
- SQL SERVER 中的*=和=*
一.* =和= * 是在sql server2000中左连接,右连接的用法相当于left join 和right join,现在sql2005和2008默认是不支持的,可以设置兼容2000或2008 ...
- 【转】Pro Android学习笔记(十三):用户界面和控制(1):UI开发
目录(?)[-] UI开发 方式一通过XML文件 方式二通过代码 方式三XML代码 UI开发 先理清一些UI概念: view.widget.control:这三个名词其实没有什么区别,都是一个UI元素 ...
- httpd或Nginx负载均衡tomcat
实验环境:CentOS7 #两台tomcat的基本配置如下: [root@webapps localhost]#setenforce 0 [root@webapps localhost]#iptabl ...
- mybatis 学习四 源码分析 mybatis如何执行的一条sql
总体三部分,创建sessionfactory,创建session,执行sql获取结果 1,创建sessionfactory 这里其实主要做的事情就是将xml的所有配置信息转换成一个Confi ...
- Project Server调用PSI关闭任务以进行更新锁定任务
/// <summary> /// 锁定和解锁项目任务 /// </summary> /// <param name="projectuid"> ...
- Java 数据类型间的相互转化
Java中常见基本数据类型包括(String除外[引用]) Date(int year,int month,int day,int hour,int minute,int sec); String 格 ...
- 我推荐的一些C\C++书籍
原文链接: 我推荐的一些C\C++书籍 人们常常问我有什么C++和编程的书籍推荐,也许是因为我在PowerDNS有一个关于"编写可读性良好的C++代码"的演讲.这篇博文可以作为我对 ...
- Java进阶之美文共享
2.在Java中如何避免"!=null"式的判空语句? 3.Java问答:终极父类(3) Java问答:终极父类(下) Java问答:终极父类(上) 内存不足:杀死进程还是牺牲 ...