整理下线段树吧 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 然后修改操作可以考虑 ...
随机推荐
- php手记之01-tp5框架安装
1.1.介绍 在web领域,PHP是所有编程语言中比较受欢迎的一门语言! PHP已经诞生出几十种编程框架!但国内最热门和使用率最好的框架有Thinkphp和Laravel这两款PHP框架! 1.2.为 ...
- routine的加载
// Hearthbuddy.Windows.MainWindow // Token: 0x06000245 RID: 581 RVA: 0x0008C318 File Offset: 0x0008A ...
- PhpStorm 增加Swoole智能提示
下载https://github.com/eaglewu/swoole-ide-helper的源码 git clone https://github.com/eaglewu/swoole-ide-he ...
- 性能监控 | MAT分析内存泄漏
使用MAT分析内存泄漏(二)八周年重印版 - 知乎 .u-safeAreaInset-top { height: constant(safe-area-inset-top) !important; h ...
- vue elementUI 表单校验(多层嵌套)
<template> <el-form :model="formData" :rules="formRule" ref="formD ...
- NetHogs监控Linux的每个进程流量
在日常运维环境中,我们肯定会遇到以下这种需求: 1.网络流量异常,不知道是哪个程序的流量爆涨? 2.日常需要监控网络实时的流量进去数据 面试装逼系列|这篇文章,让运维监控不再成为你的短板! 学会这 1 ...
- 【转载】 AutoML相关论文
原文地址: https://www.cnblogs.com/marsggbo/p/9308518.html ---------------------------------------------- ...
- HTML5 地理位置定位API(5)
HTML5 Geolocation API (地理位置应用程序接口) 目前PC浏览器支持情况: Firefox 3.5+Chrome 5.0+Safari 5.0+Opera 10.60+Intern ...
- ifc tree
ViewerWidget* viewerWidget = new ViewerWidget(ifcModel); viewerWidget ->setRootNode(ifcModel-> ...
- elasticsearch _search结果解析
kibana中输入:GET /_search 会返回一下结果: { "took": 9, # took:整个搜索请求花费多少毫秒 "timed_out": fa ...