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

这是一个伤心的故事……

题意:





思路:

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

然后就一搞 就出来了

//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. codevs 3372 选学霸(hash+并查集+多重背包)

    先通过并查集处理出来有多少种不同的集合,每一个集合有多少人.一定要不要忘记了与别的没有联系的独立点. 并查集的时候能够通过hash处理出来每一个数目同样的集合的个数. 这样以人数为权值.个数为限制进行 ...

  2. Visual C++文件后缀名释义

    [1] .APS:存放二进制资源的资源辅助中间文件(可加快资源装载速度). [2] .BMP:位图资源文件. [3] .BSC:浏览信息文件.由浏览信息维护工具(BSCMAKE)从原始浏览信息文件(. ...

  3. android 退出系统

    /** * */ package com.szkingdom.android.phone.utils; import java.io.BufferedReader; import java.io.IO ...

  4. centos6.0 配置SVN

    基本步骤: 1.安装必需的subversion 2.创建版本库 3.配置用户和权限 4.钩子和svn常用命令说明 一.安装subversion 在这里我们使用yum来安装subversion,使用以下 ...

  5. 移动端 input光标问题 以及 监听输入

    1.  input 框光标问题: input框 在ios上显示的与Android是不一样的 显示是这样的 而且在输入的时候 光标位置变化了 是这样的 为了达到一致的效果 在行高加上\9     如:l ...

  6. IOS系统设置页面跳转

    目录: 跳转 iOS10- 版本跳转url转 iOS10+ 版本跳转url转 跳转符 跳转到系统设置界面代码: // 自己应用的设置界面:url = UIApplicationOpenSettings ...

  7. Activiti 23张表及7大服务详解

    7大服务介绍 服务名称 描述 RepositoryService Activiti 中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据 ( 例如 BPMN2.0 XML 文件, ...

  8. 优动漫PAINT-牵牛花画法教程

    喇叭型对画者自身的塑形功力会有较高的要求,作者很靠谱的把他的塑形方式详细呈现了出来~ 对于这样的一个仿真效果的牵牛花完全可以使用优动漫PAINT完成,简单又快捷,软件下载:http://www.don ...

  9. 路飞学城Python-Day11

    [44.函数-生成器] 需求:有一个列表 [0,1,2,3,4,5,6,7,8,9],对这个列表循环+1 li = [0,1,2,3,4,5,6,7,8,9] li = map(lambda x:x+ ...

  10. CF1000G Two-Paths (树形DP)

    题目大意:给你一棵树,点有点权$a_{i}$,边有边权$w_{e}$,定义一种路径称为$2-path$,每条边最多经过2次且该路径的权值为$\sum _{x} a_{x}\;-\;\sum_{e}w_ ...