自从某次考试写线段树写挂了以后 这是第一次写线段树,,,,,,

这是一个伤心的故事……

题意:





思路:

标记 维护从左到右的最大值 从右到左的最大值 区间内的最大值……

然后就一搞 就出来了

//By SiriusRen
#include <cstdio>
using namespace std;
int n,m,jy,xx,yy,d,D;
struct Tree{int lsum,rsum,sum,cover;}tree[222222];
inline int max(int x,int y){return x>y?x:y;}
inline int read(){
int x=0;char p=getchar();
while(p<'0'||p>'9')p=getchar();
while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();
return x;
}
void build(int l,int r,int pos){
if(l==r){tree[pos].sum=tree[pos].lsum=tree[pos].rsum=1;return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
build(l,mid,lson),build(mid+1,r,rson);
tree[pos].lsum=tree[pos].rsum=tree[pos].sum=tree[lson].sum+tree[rson].sum;
}
void push_down(int num,int pos){
int lson=pos<<1,rson=pos<<1|1;
tree[lson].cover=tree[rson].cover=tree[pos].cover;
if(tree[pos].cover==1){
tree[lson].lsum=tree[lson].rsum=tree[lson].sum=num-(num>>1);
tree[rson].lsum=tree[rson].rsum=tree[rson].sum=num>>1;
}
else{
tree[lson].lsum=tree[lson].rsum=tree[lson].sum=0;
tree[rson].lsum=tree[rson].rsum=tree[rson].sum=0;
}
tree[pos].cover=0;
}
void push_up(int num,int pos){
int lson=pos<<1,rson=pos<<1|1,div=num>>1;
tree[pos].lsum=tree[lson].lsum,tree[pos].rsum=tree[rson].rsum;
tree[pos].sum=max(max(tree[lson].sum,tree[rson].sum),tree[lson].rsum+tree[rson].lsum);
if(tree[lson].lsum==num-div)tree[pos].lsum+=tree[rson].lsum;
if(tree[rson].rsum==div)tree[pos].rsum+=tree[lson].rsum;
}
int query(int l,int r,int pos){
if(l==r)return l;
if(tree[pos].cover)push_down(r-l+1,pos);
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(tree[pos].sum>=d){
if(tree[lson].sum>=d)return query(l,mid,lson);
if(tree[lson].rsum+tree[rson].lsum>=d)return mid+1-tree[lson].rsum;
return query(mid+1,r,rson);
}
return 0;
}
void insert(int l,int r,int pos,int id){
if(l>=xx&&r<=yy){
tree[pos].cover=id;
tree[pos].lsum=tree[pos].rsum=tree[pos].sum=(id==1?r-l+1:0);
return;
}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1,len=r-l+1;
if(tree[pos].cover)push_down(len,pos);
if(mid<xx)insert(mid+1,r,rson,id);
else if(mid>=yy)insert(l,mid,lson,id);
else insert(l,mid,lson,id),insert(mid+1,r,rson,id);
push_up(len,pos);
}
int main(){
scanf("%d%d",&n,&m);
build(1,n,1);
for(int i=1;i<=m;i++){
jy=read();
if(jy==1){
D=read(),d=D;
xx=query(1,n,1),yy=xx+D-1;
printf("%d\n",xx);
if(xx)insert(1,n,1,2);
}
else{
xx=read(),yy=read();
yy=xx+yy-1;
insert(1,n,1,1);
}
}
}

POJ 3667 线段树+标记的更多相关文章

  1. POJ 3667 线段树区间合并裸题

    题意:给一个n和m,表示n个房间,m次操作,操作类型有2种,一种把求连续未租出的房间数有d个的最小的最左边的房间号,另一个操作时把从x到x+d-1的房间号收回. 建立线段树,值为1表示未租出,0为租出 ...

  2. poj 3667 线段树

    题意:1 a:询问是不是有连续长度为a的空房间,有的话住进最左边2 a b:将[a,a+b-1]的房间清空思路:记录区间中最长的空房间线段树操作:update:区间替换 query:询问满足条件的最左 ...

  3. POJ 3667 线段树区间合并

    http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html 用线段树,首先要定义好线段树的节点信息,一般看到一个问题,很难很 ...

  4. POJ 3667 线段树的区间合并简单问题

    题目大意:有一排标号1-N的房间.操作一:询问是不是有连续长度为a的空房间,有的话住进最左边(占用a个房间)操作二:将[a,a+b-1]的房间清空(腾出b个房间)思路:记录每个区间中“靠左”“靠右”“ ...

  5. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

  6. hdu 3954 线段树 (标记)

    Level up Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. poj 2886 线段树+反素数

    Who Gets the Most Candies? Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12744   Acc ...

  8. BZOJ4785 [Zjoi2017]树状数组 【二维线段树 + 标记永久化】

    题目链接 BZOJ4785 题解 肝了一个下午QAQ没写过二维线段树还是很难受 首先题目中的树状数组实际维护的是后缀和,这一点凭分析或经验或手模观察可以得出 在\(\mod 2\)意义下,我们实际求出 ...

  9. Codeforces 258E - Little Elephant and Tree(根号暴力/线段树+标记永久化/主席树+标记永久化/普通线段树/可撤销线段树,hot tea)

    Codeforces 题目传送门 & 洛谷题目传送门 yyq:"hot tea 不常有,做过了就不能再错过了" 似乎这是半年前某场 hb 模拟赛的 T2?当时 ycx.ym ...

随机推荐

  1. php在数字前面补0得到固定长度数字的两种方法

    比較基础,事实上两个内置函数都能实现. 1  sprintf 语法: string sprintf(string format, mixed [args]...); 返回值: 字符串 函数种类: 资料 ...

  2. 弹性ScrollView,和下啦刷新的效果相似 实现下拉弹回和上拉弹回

    今天做了一个弹性ScrollView,和下啦刷新的效果类似,我想这个非常多需求都用的这样的效果 事实上这是一个自己定义的scrollView,上代码.这是我写在一个公共的组件包里的 package c ...

  3. 一题多解(一) —— list(Python)判空(以及 is 与 == 的区别)

    >> l = [] 1. == >> l == [] True 2. not >> not l True 3. 注意 is 与 == 的区别 >> l ...

  4. Mysql实战45讲 05讲深入浅出索引(下)极客时间 读书笔记

    极客时间 Mysql实战45讲 04讲深入浅出索引(下)极客时间 笔记体会: 回表:回到主键索引树搜索的过程,称为回表覆盖索引:某索引已经覆盖了查询需求,称为覆盖索引,例如:select ID fro ...

  5. POJ 2132 暴搜OR Floyd

    题意: 给你一个邻接矩阵(n<=25)问所有1到2路径的gcd的lcm是多少. 一些经验(WA/TLE的经验): 1. 无脑暴搜 是会TLE的--. 2. 关于精度 dyf神牛说了:long l ...

  6. github上下载开源项目

    1.首先获取到设置信息 2.找到克隆的路径(本步骤不包含下载.zip的方法) 3.打开 Git Shell ->输入: cd ../../ ->输入: cd  想要安装的路径 ->输 ...

  7. js小结2

    1.includes和contains 对于字符串,数组来说,判断包含是includes,对classList是contains 2.编辑span内容,enter提交(如何避免keydown之后换行: ...

  8. Scrapy中scrapy.Request和response.follow的区别

    在写scrapy的spider类的parse方法的时候,有些链接需要提取出来继续爬取,这里scrapy提供了一些方法可以方便的实现这个功能,总结如下: 假设我们的目标a标签是target_a 方法1: ...

  9. php时间差方法

    /** * 时间差计算 * * @param Timestamp $time * @return String Time Elapsed */ function time2Units ($time,$ ...

  10. pthread_join/pthread_exit的用法解析

    官方说法: 函数pthread_join用来等待一个线程的结束.函数原型为: extern int pthread_join __P ((pthread_t __th, void **__thread ...