PKU 3667 Hotel (线段树,区间合并,最长连续区间)
题意:宾馆有N个房间(1~N),M个操作,a=1,输入b,表示N间房是否有连续的b间房。有输出最左边的房编号
没有输出0。a=2,输入b,c表示房间b到c清空。
模仿了大神的代码,敲了一遍,有些地方还要深入了解。
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <queue>
#include <math.h>
#define M 50001
#define eps 1e-6
#define LL long long
using namespace std; struct node
{
int left,right;
int lsum,rsum,msum;
int lazy;
}tree[M*3]; void push_up(int id)
{
int ll=tree[id<<1].right-tree[id<<1].left+1;
int rr=tree[id<<1|1].right-tree[id<<1|1].left+1;
tree[id].lsum=tree[id<<1].lsum;
if(tree[id<<1].lsum==ll)
tree[id].lsum+=tree[id<<1|1].lsum;
tree[id].rsum=tree[id<<1|1].rsum;
if(tree[id].rsum==rr)
tree[id].rsum+=tree[id<<1].rsum;
tree[id].msum = max(max(tree[id<<1].msum,tree[id<<1|1].msum),tree[id<<1].rsum+tree[id<<1|1].lsum);
}
void push_down(int id)
{
if(tree[id].lazy!=-1)
{
int ll=tree[id<<1].right-tree[id<<1].left+1;
int rr=tree[id<<1|1].right-tree[id<<1|1].left+1;
tree[id<<1].lazy=tree[id<<1|1].lazy=tree[id].lazy;
tree[id].lazy=-1;
tree[id<<1].rsum = tree[id<<1].lsum = tree[id<<1].msum = tree[id<<1].lazy ? 0:ll;
tree[id<<1|1].rsum = tree[id<<1|1].lsum = tree[id<<1|1].msum = tree[id<<1|1].lazy ?0:rr;
}
}
void build(int id,int l,int r)
{
tree[id].left=l;tree[id].right=r;
tree[id].lsum=tree[id].rsum=tree[id].msum=(r-l+1);
tree[id].lazy=-1;
if(l==r)
return ;
int mid=(l+r)/2;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
//push_up(id);
} void update(int id,int l,int r,int c)
{
if(tree[id].left==l&&tree[id].right==r)
{
tree[id].lsum=tree[id].rsum=tree[id].msum=c?0:(r-l+1);
tree[id].lazy=c;
return ;
}
push_down(id);
int mid=(tree[id].left+tree[id].right)/2;
if(r<=mid) update(id<<1,l,r,c);
else if(l>mid) update(id<<1|1,l,r,c);
else
{
update(id<<1,l,mid,c);
update(id<<1|1,mid+1,r,c);
}
push_up(id);
}
int query(int id,int v)
{
if(tree[id].left==tree[id].right) return tree[id].left;
push_down(id);
int mid=(tree[id].left+tree[id].right)/2;
if(tree[id<<1].msum>=v)//假设左子树的最大连续空>=需求量。那么直接进入左子树,=也去左子树的原因是题目要求的最左
return query(id<<1,v);
else if(tree[id<<1].rsum+tree[id<<1|1].lsum>=v)//左子树的连续右+右子树的连续左>=w,说明找到了能够直接求出
return mid-tree[id<<1].rsum+1;
return query(id<<1|1,v);
} int main()
{ int n,m;
while(~scanf("%d%d",&n,&m))
{
int a,b,c;
build(1,1,n);
while(m--)
{
scanf("%d",&a);
if(a==1)
{
scanf("%d",&c);
if(tree[1].msum<c) printf("0\n");//根节点的最大连续空间不够
else
{
int p=query(1,c);
printf("%d\n",p);
update(1,p,p+c-1,1);//把这段更新为被覆盖
}
}
else
{
scanf("%d%d",&b,&c);
update(1,b,b+c-1,0);//把这段更新为未被覆盖
}
}
}
return 0;
} /*
10 6
1 3
1 3
1 3
1 3
2 5 5
1 6
*/
PKU 3667 Hotel (线段树,区间合并,最长连续区间)的更多相关文章
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
- POJ 3667 Hotel (线段树区间合并)
题目链接:http://poj.org/problem?id=3667 最初给你n间空房,m个操作: 操作1 a 表示检查是否有连续的a间空房,输出最左边的空房编号,并入住a间房间. 操作2 a b ...
- POJ 3667 & 1823 Hotel (线段树区间合并)
两个题目都是用同一个模板,询问最长的连续未覆盖的区间 . lazy代表是否有人,msum代表区间内最大的连续长度,lsum是从左结点往右的连续长度,rsum是从右结点往左的连续长度. 区间合并很恶心啊 ...
- PKU 3667 Hotel(线段树)
Hotel The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a ...
- 线段树(区间合并) POJ 3667 Hotel
题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...
- Poj 3667——hotel——————【线段树区间合并】
Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13124 Accepted: 5664 Descriptio ...
- poj3667 Hotel (线段树 区间合并)
poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...
- 【bzoj1593】[Usaco2008 Feb]Hotel 旅馆 线段树区间合并
题目描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...
- poj-3667(线段树区间合并)
题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...
- HDU 3911 线段树区间合并、异或取反操作
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...
随机推荐
- android cmd adb命令安装和删除apk应用
copy自http://blog.csdn.net/xpsharp/article/details/7289910 1. 安装Android应用程序 1) 启动Android模拟器 2) adb in ...
- 详谈Struts+Hibernate+Spring三大框架
前言:对于JAVA WEB端的程序员来说,对JAVA三大框架:Struts+Hibernate+Spring的了解必不可缺,下面详细谈谈 Java三大框架主要用来做WEN应用. 三大框架:Struts ...
- HDU_1874_畅通工程续_最短路问题
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- swift Hashable Equatable
/// You can use any type that conforms to the `Hashable` protocol in a set or /// as a dictionary ke ...
- 使用JS获取request参数
1.document.write('<%=request.getAttribute("param")%>'); 2.window.navigator.userAgent ...
- CodeFrist基础_Fluent Api
一丶首先新建两个实体类 public class Student { public int StudentKey { get; set; } public string StudentName { g ...
- kvm--virsh命令行下管理虚拟机
virsh 既有命令行模式,也有交互模式,在命令行直接输入 virsh 就进入交互模式, virsh 后面跟命令参数,则是命令行模式: (1)基础操作 --- 命令行下管理虚拟机 virsh list ...
- Linux kernel 内存 - 页表映射(SHIFT,SIZE,MASK)和转换(32位,64位)
0. Intro 如下是在32位下的情况,32位下,只有三级页表:PGD,PMD,PTE 在64位情况下,会有四级页表:PGD,PUD,PMD,PTE 但是原理基本上是一样的,本文主要是想记录一下页表 ...
- qemu vm setup network(ssh) with buildroot
1, build buildroot with buildroot.config, that is 'make qemu_x86_64_defconfig' + some packages, sshd ...
- Spring 中无处不在的 Properties
转自:https://javadoop.com/post/spring-properties?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sou ...