整理下线段树吧 poj hotel
除了上次的新学的有 区间更新 延迟更新 区间合并
先说下区间更新以及延迟更新吧
既然是对区间的维护 在求解一些问题的时候 有的时候没有必要对所有的自区间都进行遍历 这个时候 延迟标记就派上用场了 (只有在需要的时候才对子区间更新)
struct node()
{
int l,r,len;
int flag=0;
}stu[maxn];
void pushdown(int i)
{
if(stu[i].flag)
{
stu[i*2].flag=stu[i*2+1].flag=stu[i].flag;
/// 还需要根据题目的意思 做一些处理
}
}
void updata(int l,int r,int i)//l , r 为需要查找区间的范围 x y 为目的区间
{
if(x<=l&&r<=y)//找到对应的区间
{
return;
}
int mid=(l+r)/2;
pushdown(i);
if(x<=mid) updata(l,mid,i*2);
if(y>mid) updata(mid+1,r,i*2+1);
}
poj hotel
#include<iostream>
#define maxn 50010
using namespace std;
int n,m,a,b;
int cmd;
struct stu
{
int r,l;
int flag;
int tlen,llen,rlen;
int up()
{
tlen=llen=rlen=(flag? 0:r-l+1);
}
};
stu mapp[maxn*4];
void build(int l,int r,int count)
{
mapp[count].l=l;
mapp[count].r=r;
mapp[count].tlen=mapp[count].llen=mapp[count].rlen=r-1+1;
mapp[count].flag=0;
if(l==r) return;
int mid=(l+r)/2;
build(l,mid,count*2);
build(mid+1,r,count*2+1);
}
void push(int count) //延迟更新
{
if(mapp[count].flag!=-1)
{
mapp[count*2].flag=mapp[count*2+1].flag=mapp[count].flag;
mapp[count].flag=-1;
mapp[count*2].up();
mapp[count*2+1].up();
} }
int que(int l,int r,int count)
{
if(mapp[count].l==mapp[count].r&&mapp[count].tlen) return mapp[count].l;
push(count);
if(mapp[count*2].tlen>=a) return que(l,r,count*2);
else if(mapp[count*2].rlen+mapp[count*2+1].llen>=a)
{
return mapp[count*2].r-mapp[count*2].rlen+1;
}
else if(mapp[count*2+1].tlen>=a) return que(l,r,count*2+1);
else return 0;
}
void updata(int l,int r,int v,int count)
{
if(mapp[count].l==l&&mapp[count].r==r)
{
mapp[count].flag=v;
mapp[count].up();
return;
}
push(count);
int mid=(mapp[count].l+mapp[count].r)/2;
if(r<=mid) updata(l,r,v,count*2);
else if(l>=mid+1) updata(l,r,v,count*2+1);
else
{
updata(l,mid,v,count*2);
updata(mid+1,r,v,count*2+1);
}
int tmp=max(mapp[count*2].tlen,mapp[count*2+1].tlen); // 后面为pushup函数
mapp[count].tlen=max(tmp,mapp[count*2].rlen+mapp[count*2+1].llen);
mapp[count].llen=mapp[count*2].llen;
mapp[count].rlen=mapp[count*2+1].rlen;
if(mapp[count*2].tlen==(mapp[count*2].r-mapp[count*2].l+1))
{
mapp[count].llen+=mapp[count*2+1].llen;
}
if(mapp[count*2+1].tlen==(mapp[count*2+1].r-mapp[count*2+1].l+1))
{
mapp[count].rlen+=mapp[count*2].rlen;
}
}
int main()
{
cin.sync_with_stdio(false);
while(cin>>n>>m)
{
build(1,n,1);
for(int i=0;i<m;i++)
{
cin>>cmd;
if(cmd==1)
{
cin>>a;
int ans=que(1,n,1);
cout<<ans<<endl;
if(ans) updata(ans,ans+a-1,1,1);
}
else
{
cin>>a>>b;
updata(a,a+b-1,0,1);
}
}
}
return 0;
}
整理下线段树吧 poj hotel的更多相关文章
- 线段树+离散化 POJ 2528 Mayor's posters
题目传送门 题意:在一面墙上贴海报,有先后顺序,问最后有多少张不同的海报(指的是没被覆盖或者只是部分覆盖的海报) 分析:这题数据范围很大,直接搞超时+超内存,需要离散化:离散化简单的来说就是只取我们需 ...
- poj 3468 整理一下线段树的写法
// 对于延迟更新,我们在updata 和query的时候 pushdown和pushup两个东西都要存在 #include <iostream> #include <cstdio& ...
- poj 2528 线段树+离散化
题意:在墙上贴一堆海报(只看横坐标,可以抽象成一线段),新海报可以覆盖旧海报.求最后能看到多少张海报 sol:线段树成段更新.铺第i张海报的时候更新sg[i].x~sg[i].y这一段为i. 然而坐标 ...
- poj 2828(线段树单点更新)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 18561 Accepted: 9209 Desc ...
- 洛谷 P3521 ROT-Tree Rotations [POI2011] 线段树
正解:线段树合并 解题报告: 传送门! 今天学了下线段树合并,,,感觉线段树相关的应用什么的还是挺有趣的,今天晚上可能会整理一下QAQ? 然后直接看这道题 现在考虑对一个节点nw,现在已经分别处理出它 ...
- UVA 12299 线段树 ( 单点跟新 , 区间查询)
题目链接:题意:在传统的RMQ的基础上加上一个操作:shift(i1,i2,i3...ik),表示将这些元素,依次向左移动一位(训练指南247页) #include <iostream> ...
- hdu 5091(线段树+扫描线)
上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...
- HDU1394(线段树||树状数组)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 洛谷P4556 雨天的尾巴 线段树
正解:线段树合并 解题报告: 传送门! 考虑对树上的每个节点开一棵权值线段树,动态开点,记录一个max(num,id)(这儿的id,define了一下,,,指的是从小到大排QAQ 然后修改操作可以考虑 ...
随机推荐
- Deep & Cross Network总结
一.介绍 CTR预估全称是Click Through Rate,就是展示给用户的广告或者商品,估计用户点击的概率.公司规模较大的时候,CTR直接影响的价值在数十亿美元的级别.广告支付一个非常流行的模型 ...
- OAuth 2.0 的四种方式
上一篇文章介绍了 OAuth 2.0 是一种授权机制,主要用来颁发令牌(token).本文接着介绍颁发令牌的实务操作. 下面我假定,你已经理解了 OAuth 2.0 的含义和设计思想,否则请先阅读这个 ...
- Postgresql使用coalesce实现类似oracle的NVL方法
COALESCE (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值. 如果所有的表达式都是空值,最终将 ...
- (四)OpenCV-Python学习—形态学处理
通过阈值化分割可以得到二值图,但往往会出现图像中物体形态不完整,变的残缺,可以通过形态学处理,使其变得丰满,或者去除掉多余的像素.常用的形态学处理算法包括:腐蚀,膨胀,开运算,闭运算,形态学梯度,顶帽 ...
- Java 中清空map
本文链接:https://blog.csdn.net/TsuiXh/article/details/87879004在开发中在使用Map时,如果需要将Map作为临时的数据存储和处理,可以不用每次都去新 ...
- leetcode 55. Jump Game、45. Jump Game II(贪心)
55. Jump Game 第一种方法: 只要找到一个方式可以到达,那当前位置就是可以到达的,所以可以break class Solution { public: bool canJump(vecto ...
- Quartz.Net 学习随手记之03 配置文件
第一种方式:直接写入代码中 NameValueCollection properties = new NameValueCollection(); properties["quartz.sc ...
- 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_08-用户认证-认证服务查询数据库-用户登录前端
点击登陆注册链接 跳转到登陆的页面 门户的前端代码 当前路径base64编码 登陆的表单,在学习中心的前端. 这就是登陆的表单 这是表单的校验 请求服务端的接口 登陆请求的方法 请求的地址nginx上 ...
- 简单模拟CO模块
promise方式: // 对co模块的简单模拟 function run(gen){ var g = gen(); function next(data){ var result = g.next( ...
- c# 调用mysql数据库验证用户名和密码
使用mysql数据库验证用户名和密码时,如果用户名是中文,一直查不到数据 需要把app.config 中修改为 数据库统一设置utf8编码格式,连接数据库的时候设置编码Charset=utf8可以避免 ...