zoukankan      html  css  js  c++  java
  • poj 1823 hotel

    View Code
    #include <stdio.h>
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define maxn 16000
    struct node
    {
        int llen,rlen,maxlen,c;
    }setree[maxn<<2];
    int max(int a,int b)
    {
        return a>b?a:b;
    }
    int min(int a,int b)
    {
        return a<b?a:b;
    }
    void build(int l,int r,int rt)
    {
        setree[rt].llen=setree[rt].rlen=setree[rt].maxlen=r-l+1;
        setree[rt].c=-1;
        if(l==r)
        return;
        int m=(l+r)>>1;
        build(lson);
        build(rson);
    }
    void pushdown(int rt,int m)
    {
        if(setree[rt].c!=-1){
            setree[rt<<1].llen=setree[rt<<1].rlen=setree[rt<<1].maxlen=setree[rt].c?0:m-m/2;
            setree[rt<<1|1].llen=setree[rt<<1|1].rlen=setree[rt<<1|1].maxlen=setree[rt].c?0:m/2;
            setree[rt<<1].c=setree[rt<<1|1].c=setree[rt].c;
            setree[rt].c=-1;
        }
    }
    void pushup(int rt,int m)
    {
        setree[rt].llen=setree[rt<<1].llen;
        if(setree[rt<<1].llen==m-m/2)
        setree[rt].llen+=setree[rt<<1|1].llen;
        
        setree[rt].rlen=setree[rt<<1|1].rlen;
        if(setree[rt<<1|1].rlen==m/2)
        setree[rt].rlen+=setree[rt<<1].rlen;
        
        setree[rt].maxlen=max(setree[rt<<1].rlen+setree[rt<<1|1].llen,max(setree[rt<<1].maxlen,setree[rt<<1|1].maxlen));
    }
    void update(int l,int r,int rt,int L,int R,int c)
    {
        if(L<=l&&r<=R){
            setree[rt].llen=setree[rt].rlen=setree[rt].maxlen=c?0:r-l+1;
            setree[rt].c=c?1:0;
            return;
        }
        pushdown(rt,r-l+1);
        int m=(l+r)>>1;
        if(L<=m)
        update(lson,L,R,c);
        if(R>m)
        update(rson,L,R,c);
        pushup(rt,r-l+1);
    }
    int main()
    {
        int n,p;
        scanf("%d%d",&n,&p);
        build(1,n,1);
        while(p--){
            int op;
            scanf("%d",&op);
            if(op==1){
                int a,b;
                scanf("%d%d",&a,&b);
                update(1,n,1,a,a+b-1,1);
            }
            else if(op==2){
                int a,b;
                scanf("%d%d",&a,&b);
                update(1,n,1,a,a+b-1,0);
            }
            else
            printf("%d\n",setree[1].maxlen);
        }
    }

    题目大意:一个旅馆有N(3 <= N <= 16 000)个房间,开始时均为空。现在有三种操作:
    (1)从编号为a的房间开始,连续b个房间有人入住。

    (2)从编号为a的房间开始,连续b个房间清空。

    (3)查询N个房间里的最长连续空房数。

    思路:线段树区间更新,延时标记等。

  • 相关阅读:
    AGC007题解
    博弈论学习笔记
    ZROI2019 提高十连测
    男人八题2019
    LOJ 2840「JOISC 2018 Day 4」糖
    CF671D Roads in Yusland
    网络流套路小结
    BZOJ 3729 GTY的游戏
    AGC036C GP 2
    BZOJ 5046 分糖果游戏
  • 原文地址:https://www.cnblogs.com/kim888168/p/2755055.html
Copyright © 2011-2022 走看看