整理下线段树吧 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 然后修改操作可以考虑 ...
随机推荐
- 关于Kernel的思考
学习播客_KLDA(推导得很通俗,下面的推导就是源于此篇博客) 第一部分:按照自己的理解,模仿抄!学习播客来完成一下KLDA的推导. 第二部分:对于Kernel的思考 KLDA:顾名思义,就是把Ker ...
- Qt之模型/视图(实时更新数据)
上两节简单介绍了Qt中对于模型/视图的编程,大部分助手里说的很清楚了,现在就开始实战部分吧! 在实际应用中,视图展示的数据往往并非一成不变的,那么如何实时更新成了一个很重要的问题!功能:(1)添加委托 ...
- Flutter移动电商实战 --(44)详细页_首屏自定义Widget编写
把详细页的图片.标题.编号和价格形成一个单独的widget去引用 详情页的顶部单独封装个插件 在pages下面新建detials_page的文件件并在里面新建页面details_top_area.da ...
- vue页面刷新重定向
在App.vue中,添加如下代码: created(){ if(this.$router.path !== '/RealTimeMonitoring'){ this.$router.replace(' ...
- IfcAxis2Placement3D IFC构件的位置和方向
IfcAxis2Placement3D定义了三维空间中物体的位置和方向,由三部分组成: The attribute Axis defines the Z direction, RefDirection ...
- .NET CORE添加引用包
一 .添加服务端引用 1.直接右键添加项目引用,添加后再csproj文件中如下②,也可以直接用这种格式写入csproj文件中 2.直接右键添加DLL引用,添加后再csproj文件中如下③,也可以直接用 ...
- LD_LIBRARY_PATH无效
在os x 上设置LD_LIBRARY_PATH无效,env命令看不到这个变量,下面的文章说明了这个问题 说明:网上基本针对这个值的设置分为两面,Windows派和Linux派,Windows的不说, ...
- web前端学习路程
学习路程: 1.HTML和CSS基础 2.JavaScript语言 3.jQuery and ajax 4.综合网站实践 5.优化及调试
- 创建.Net Core For WPF项目并且添加VS Code编译运行支持
1.下载最新的Visual Studio 2019或者Preview版本,新建项目,找到"WPF App(.Net Core)"模板. 2.输入项目名称"NetCore- ...
- VSCode 查看、还原本地代码历史版本
参考链接:https://blog.csdn.net/luckystar_99/article/details/100583141