关闭

POJ 3667 Hotel 线段树区间合并

标签: acmpoj合并
279人阅读 评论(0) 收藏 举报
分类:

题意

一开始有1~n个空房间

对应2个操作 

i)问有没有连续的长度为x的x间房如果有占满最左边的那个区间,输出这个区间的起点

ii)把区间x~x+y-1的房间清空

一个很明显的区间合并具体注意点写在注释里了

ACcode:

#include <cstdio>
#include <algorithm>
#define tmp (st<<1)
#define mid ((l+r)>>1)
#define lson l,mid,tmp
#define rson mid+1,r,tmp|1
#define len (r-l+1)
#define maxn 50002
using namespace std;
int sum[maxn<<2],lsum[maxn<<2],rsum[maxn<<2],col[maxn<<2];
inline void push_up(int st,int m){
    lsum[st]=lsum[tmp];
    rsum[st]=rsum[tmp|1];
    if(lsum[st]==m-(m>>1))lsum[st]+=lsum[tmp|1];
    if(rsum[st]==m>>1)rsum[st]+=rsum[tmp];
    sum[st]=max(max(sum[tmp],sum[tmp|1]),lsum[tmp|1]+rsum[tmp]);
}
inline void push_down(int st,int m){
    if(col[st]!=-1){
        col[tmp]=col[tmp|1]=col[st];
        sum[tmp]=lsum[tmp]=rsum[tmp]=col[st]*(m-(m>>1));
        sum[tmp|1]=lsum[tmp|1]=rsum[tmp|1]=col[st]*(m>>1);
        col[st]=-1;
    }
}
inline void build(int l,int r,int st){
    col[st]=-1;
    sum[st]=lsum[st]=rsum[st]=len;
    if(l==r)return;
    build(lson);
    build(rson);
}
inline void updata(int L,int R,int add,int l,int r,int st){
    if(L<=l&&r<=R){
        col[st]=add;
        sum[st]=lsum[st]=rsum[st]=add*len;
        return ;
    }
    push_down(st,len);
    if(L<=mid)updata(L,R,add,lson);
    if(mid<R)updata(L,R,add,rson);
    push_up(st,len);
}
inline int query(int x,int l,int r,int st){
    if(l==r)return l;
    push_down(st,len);
    if(sum[tmp]>=x)return query(x,lson);///左子树满足
    else if(rsum[tmp]+lsum[tmp|1]>=x)return mid-rsum[tmp]+1;///左子树的右边区间和右子树的左区间满足条件
    return query(x,rson);
}
int main(){
    int n,q;
    while(~scanf("%d%d",&n,&q)){
        build(1,n,1);
        int z,x,y;
        while(q--){
            scanf("%d%d",&z,&x);
            if(z==1){
                if(sum[1]<x){printf("0\n");continue;}///总区间就不满足
                int temp=query(x,1,n,1);
                printf("%d\n",temp);
                updata(temp,temp+x-1,0,1,n,1);
            }
            else{
                scanf("%d",&y);
                y=x+y-1;
                updata(x,y,1,1,n,1);
            }
        }
    }
    return 0;
}
/*
10 6
1 3
1 3
1 3
1 3
2 5 5
1 6
*/


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

poj 3667 Hotel(区间合并)

题目链接; poj 3667 Hotel 题意:有n个房间,m组询问,询问中第一个数字表示方式,1表示住人,后面的那个数表示住店的人数,2表示清空,后面跟着两个数字票p,q,表示从第p个房间开始数,q个房间清空,我们尽可能的要使人住在左边的房间且房间数必须连续,问你住店时从那个房间开始住;...
  • xinshoushanglu2333
  • xinshoushanglu2333
  • 2015-10-20 21:30
  • 149

POJ 3667 Hotel(区间合并)

题目地址:http://poj.org/problem?id=3667 题意:1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 2 a b:将[a,a+b-1]的房间清空 思路:记录区间中最长的空房间 思路:update区间替换,query求满足条件的最左边的一个房间 AC代码:...
  • qq_25605637
  • qq_25605637
  • 2016-04-21 13:48
  • 114

POJ 3667 Hotel (区间合并)

题意:初始给你一个1序列,然后有两个操作,一个是找到一个标号最小的位置能够 连续放下x个0,一个是吧一段全部变成1,典型的线段树区间合并。 题目要求如果有多个答案,输出字典序小的,所以我们只要在查询的时候优先 返回左边的就行。贴模板。代码:// // Created by CQU_CST_WuE...
  • CQUWEL
  • CQUWEL
  • 2016-02-09 18:44
  • 151

POJ 3667 Hotel 区间合并+区间更新

Hotel Time Limit:3000MS    Memory Limit:65536KB    64bit IO Format:%I64d & %I64u Description ...
  • Forever_wjs
  • Forever_wjs
  • 2015-08-17 10:33
  • 419

POJ 3667 Hotel(区间合并 + 区间更新)

题目链接:http://poj.org/problem?id=3667题意:宾馆有n个房间。有人来入住。共有2种操作 输入1和d,表示查询最左的连续d个空房间数的起始位置。 输入2,x和d,表示将从x开始长度为d的连续的房间清空。 思路:裸的区间合并。每个结点区间[l,r]存从左端点l开始向右最大连...
  • u014357885
  • u014357885
  • 2015-08-11 22:58
  • 471

poj(3667)——hotel(线段树区间合并)

题目的大致意思是现在有一个宾馆,然后里面共有n个房间,然后有m次询问,每次询问都有两种形式: 1: 那么代表的是现在要搬进来x个人,然后他们是有要求的,他们需要满足他们x个人都是要连续的住在一起,如果没有这种情况的话,那么就输出0,否则输出满足条件的最左边的那个区间; 2: 输入a,b,分别代表的是...
  • ACMer_hades
  • ACMer_hades
  • 2015-06-17 19:10
  • 480

POJ 3667——Hotel(线段树,区间合并)

Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12065   Accepted: 5237 D...
  • u014141559
  • u014141559
  • 2014-09-13 19:11
  • 575

【POJ】 3667 hotel (线段树-区间合并)

/* sum[rt]表示这个区间内最大的连续区间长度 lsum[rt]表示这个区间左边缘最大的连续区间长度,rsum同理。 然后对于一个端点的意义,表示的是到下一个端点间的这个长度是否被占用 剩下的就是一般的线段树方法了 */ #define _CRT_SECURE_NO_WARNINGS #inc...
  • u013611908
  • u013611908
  • 2015-03-03 16:30
  • 271

POJ 3667 - Hotel (线段树 区间合并)

Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 11243   Accepted: 4868 Description The co...
  • zhaosdfa
  • zhaosdfa
  • 2014-07-06 21:00
  • 244

POJ 3667 Hotel(线段树+区间合并)

Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 16546   Accepted: 7178 Description The co...
  • qq_34542903
  • qq_34542903
  • 2016-12-08 17:35
  • 86
    个人资料
    • 访问:377614次
    • 积分:11817
    • 等级:
    • 排名:第1478名
    • 原创:805篇
    • 转载:2篇
    • 译文:0篇
    • 评论:111条
    最新评论