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

这是一个伤心的故事……

题意:





思路:

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

然后就一搞 就出来了

//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. Java 实现适配器(Adapter)模式

    平时我们会常常碰到这种情况,有了两个现成的类,它们之间没有什么联系.可是我们如今既想用当中一个类的方法.同一时候也想用另外一个类的方法.有一个解决方法是.改动它们各自的接口.可是这是我们最不愿意看到的 ...

  2. java mail邮件发送(带附件) 支持SSL

    java mail邮件发送(带附件)有三个类 MailSenderInfo.java package mail; import java.util.Properties; import java.ut ...

  3. codeforces Looksery Cup 2015 H Degenerate Matrix 二分 注意浮点数陷阱

    #include <cstdio> #include <cstring> #include <algorithm> #include <string> ...

  4. Popupwindow 显示, 其它背景变暗。 并加上点击事件 ~ (用于记录)

    public class MainActivity extends Activity implements OnClickListener { protected int mScreenWidth; ...

  5. 关于linux下QIODevice类进行读取的几个方法的理解

    Qt中对读写设备的支持力度很大,其都继承与QIODevice类,其中有几个方法是非常值得注意的,不管是在用原始的serial port进行通信还是使用网络的TCP/IP 或者UDP或者HTTP等协议时 ...

  6. Python一行代码获得IP地址

    比较靠谱的方法, 通过构造UDP包获得本机IP地址   python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.gets ...

  7. HD-ACM算法专攻系列(8)——排序

    题目描述: 源码: #include"iostream" #include"string" using namespace std; void Order(in ...

  8. Win7 如何禁用“切换用户”功能

    1.按win+r,输入gpedit.msc,点击确定: 2.依次点击计算机配置--管理模块--系统--登录,右侧列表中找到“隐藏“快速用户切换”的入口点”: 3.双击隐藏“快速用户切换”的入口点,点击 ...

  9. MySQL学习(四)——外键

    1.比方现在有两张表“分类表”和“商品表”,为了表明商品属于哪个分类,通常我们将在商品表上添加一列,用于存放分类cid的信息,此列称为:外键. 此时分类表category称为主表,cid称为主键:商品 ...

  10. Web前端为什么这么火爆?

    Web前端为什么这么火爆? 互联网发展到今天,全球已有28.9亿互联网用户,中国有355万网站,6.5亿网民,13亿手机用户,5亿微信用户,当步入互联网+时代后,互联网已经越来越复杂,纷繁复杂的互联网 ...