poj 3669 线段树成段更新+区间合并
添加 lsum[ ] , rsum[ ] , msum[ ] 来记录从左到右的区间,从右到左的区间和最大的区间;
#include<stdio.h>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 50005
int rsum[maxn<<],lsum[maxn<<],msum[maxn<<];//msum[]维护区间1…N中的最大连续区间长度
int mark[maxn<<];
int max(int x,int y)
{
return x>y?x:y;
}
void pushup(int l,int r,int rt)
{
int m=(l+r)/;
lsum[rt]=lsum[rt<<];
rsum[rt]=rsum[rt<<|];
msum[rt]=max(msum[rt<<],msum[rt<<|]);
if(lsum[rt<<]==m-l+)
lsum[rt]=lsum[rt<<]+lsum[rt<<|];
if(rsum[rt<<|]==r-m)
rsum[rt]=rsum[rt<<|]+rsum[rt<<];
msum[rt]=max(msum[rt],lsum[rt<<|]+rsum[rt<<]);
}
void pushdown(int l,int r,int rt)
{
if(mark[rt]!=-)
{
int len=r-l+; mark[rt<<]=mark[rt];
mark[rt<<|]=mark[rt];
if(mark[rt]==)
{
lsum[rt<<]=rsum[rt<<]=msum[rt<<]=;
lsum[rt<<|]=rsum[rt<<|]=msum[rt<<|]=;
}
else
{
lsum[rt<<]=rsum[rt<<]=msum[rt<<]=len-len/;
rsum[rt<<|]=lsum[rt<<|]=msum[rt<<|]=len/;
}
mark[rt]=-;
}
}
void build(int l,int r,int rt)
{
mark[rt]=-;
if(l==r)
{
lsum[rt]=rsum[rt]=msum[rt]=;
return ;
}
int m=(l+r)/;
build(lson);
build(rson);
pushup(l,r,rt);
}
void updata(int L,int R,int c,int l,int r,int rt)
{
if(l>=L&&R>=r)
{
mark[rt]=c;
if(mark[rt]==)
{
lsum[rt]=rsum[rt]=msum[rt]=;
}
else
lsum[rt]=rsum[rt]=msum[rt]=r-l+;
return ;
}
pushdown(l,r,rt);
int m=(l+r)/;
if(m>=L)
updata(L,R,c,lson);
if(R>m)
updata(L,R,c,rson);
pushup(l,r,rt);
}
int query(int num,int l,int r,int rt)
{
if(l==r)
{
return l;
}
pushdown(l,r,rt);
int m=(l+r)/;
int ret;
if(msum[rt<<]>=num)//由于从最左边开始坐位子,所以rsum[rt<<1]>
{
return query(num,lson);
}
else if(lsum[rt<<|]+rsum[rt<<]>=num)
return m-rsum[rt<<]+;
else
return query(num,rson);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
build(,n,);
int a,b,c;
while(m--)
{
scanf("%d",&a);
if(a==)
{
scanf("%d",&b);
if(b>msum[])
printf("0\n");
else
{
int ret=query(b,,n,);
printf("%d\n",ret);
updata(ret,ret+b-,,,n,);
}
}
else
{
scanf("%d%d",&b,&c);
updata(b,b+c-,,,n,);
}
}
}
}
poj 3669 线段树成段更新+区间合并的更多相关文章
- HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )
线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...
- poj 3648 线段树成段更新
线段树成段更新需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候.延迟标记的意思是:这个区间的左右儿子都需要被更新,但是当 ...
- POJ 3468 线段树 成段更新 懒惰标记
A Simple Problem with Integers Time Limit:5000MS Memory Limit:131072K Case Time Limit:2000MS Descr ...
- POJ训练计划2777_Count Color(线段树/成段更新/区间染色)
解题报告 题意: 对线段染色.询问线段区间的颜色种数. 思路: 本来直接在线段树上染色,lz标记颜色.每次查询的话訪问线段树,求出颜色种数.结果超时了,最坏的情况下,染色能够染到叶子节点. 换成存下区 ...
- poj 3468 线段树 成段增减 区间求和
题意:Q是询问区间和,C是在区间内每个节点加上一个值 Sample Input 10 51 2 3 4 5 6 7 8 9 10Q 4 4Q 1 10Q 2 4C 3 6 3Q 2 4Sample O ...
- poj 3468 线段树成段更新
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 54012 ...
- POJ 2777 Count Color (线段树成段更新+二进制思维)
题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...
- poj 3468 A Simple Problem with Integers 【线段树-成段更新】
题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...
- 线段树(成段更新) POJ 3468 A Simple Problem with Integers
题目传送门 /* 线段树-成段更新:裸题,成段增减,区间求和 注意:开long long:) */ #include <cstdio> #include <iostream> ...
随机推荐
- 【读书笔记《Android游戏编程之从零开始》】18.游戏开发基础(碰撞检测)
1.矩形碰撞 所谓矩形碰撞,就是利用两个矩形之间的位置关系来进行判断,如果矩形的像素在另外一个矩形之中,或者之上都可以认为这两个矩形发生了碰撞. 如果单纯的去考虑哪些情况会判定两个矩形发生碰撞,倒不如 ...
- codeforces 709D D. Recover the String(构造)
题目链接: D. Recover the String time limit per test 1 second memory limit per test 256 megabytes input s ...
- CSS强制性换行word-break与word-wrap的使用
一般情况下,元素拥有默认的white-space:normal(自动换行,不换行是white-space:nowrap),当录入的文字超过定义的宽度后会自动换行,但当录入的数据是一堆没有空格的字符或字 ...
- 第11章 Windows线程池(1)_传统的Windows线程池
第11章 Windows线程池 11.1 传统的Windows线程池及API (1)线程池中的几种底层线程 ①可变数量的长任务线程:WT_EXECUTELONGFUNCTION ②Timer线程:调用 ...
- swift代理使用
代理声明: //oc调用代理 @objc(NurseListCellDelegate) protocol NurseListCellDelegate : NSObjectProtocol{ func ...
- SQL 时间处理
1.获取当前时间 GetDate() 2.获取当前年.月.日 DATEPART(yyyy,GetDate()).DATEPART(m,GetDate()).DATEPART(d,GetDate()) ...
- 【转】【MMX】 基于MMX指令集的程序设计简介
(一) MMX技术简介 Intel 公司的MMX™(多媒体增强指令集)技术可以大大提高应用程序对二维三维图形和图象的处理能力.Intel MMX技术可用于对大量数据和复杂数组进行的复杂处理,使用MMX ...
- log4j发送邮件乱码
Log4J发日志邮件给多个接收者及标题.正文乱码问题 以前开发的系统没有单独的日志管理,所有的日志统一输出到tomcat后台一个文件里,不几天就是好几G,现在要整体增加一个Log4J管理日志的功能,其 ...
- 使用POI getCell 获取空的单元格之后在使用的时候报 NullPointerException
解决办法,在得到cell之后先判断cell是否为空,然后再进行逻辑处理. 得到的cell建议使用去除策略(如左对齐,居中等)的cell,不然有可能受到策略影响而导致结果异常. org.apache.p ...
- 机器学习算法 Python & R速查表