题意: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. 【leetcode刷题笔记】Best Time to Buy and Sell Stock III

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  2. NYOJ-括号配对问题--------待解决,RE

    描述 现在,有一行括号序列,请你检查这行括号是否配对.   输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的 ...

  3. uoj problem 21 缩进优化

    题目: 小O是一个热爱短代码的选手.在缩代码方面,他是一位身经百战的老手.世界各地的OJ上,很多题的最短解答排行榜都有他的身影.这令他感到十分愉悦. 最近,他突然发现,很多时候自己的程序明明看起来比别 ...

  4. JZOJ 1003【东莞市选2007】拦截导弹——dp

    题目:https://jzoj.net/senior/#main/show/1003 只要倒推一下第一次上升的最长和第一次下降的最长就行了.不用n^2logn,枚举了 j 还要用树状数组找值比自己大的 ...

  5. CF 1036B Diagonal Walking v.2——思路

    题目:http://codeforces.com/contest/1036/problem/B 比赛时只能想出不合法的情况还有走到终点附近的方式. 设n<m,不合法就是m<k.走到终点方式 ...

  6. mount error(12): Cannot allocate memory解决办法

    http://hi.baidu.com/zhangbin101004/item/e459f4d1f818dfbd33db903b 今天囧了啊,在ubuntu挂载的文件夹里面解压数据库,结果linux嫌 ...

  7. Rails多个复选框--check_box_tag

    一.简单粗暴的解决方法 view <% @roles.each do |role| %> <%= check_box_tag 'roles[]', role.id%> < ...

  8. javascript数字千分分隔符

    function thousandBitSeparator(num) { num=num.toFixed(2); return num && num .toString() .repl ...

  9. JDBC编程之数据更新

    -------------------siwuxie095                             JDBC 编程之数据更新             首先下载 MySQL 的 JDBC ...

  10. Spring入门第二十四课

    Spring对JDBC的支持 直接看代码: db.properties jdbc.user=root jdbc.password=logan123 jdbc.driverClass=com.mysql ...