zoukankan      html  css  js  c++  java
  • 【USACO 2008FEB】 旅馆

    【题目链接】

              点击打开链接

    【算法】

              线段树

              对于一个节点,记录它从左端点延伸的最多的空房间的个数,从右端点延伸的最多的空房间个数,和该区间最多的连续

              空房间个数

    【代码】

              

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXN 50010
    
    int n,m,opt,pos,x,d;
    
    struct SegmentTree
    {
            struct Node
            {
                    int l,r,lm,rm,mx,tag;
            } Tree[MAXN*4];
            inline void build(int index,int l,int r)
            {
                    int mid;
                    Tree[index].l = l;
                    Tree[index].r = r;
                    Tree[index].lm = Tree[index].rm = Tree[index].mx = r - l + 1;
                    Tree[index].tag = -1;
                    if (l == r) return;
                    mid = (l + r) >> 1;
                    build(index<<1,l,mid);
                    build(index<<1|1,mid+1,r);
            }
            inline void pushdown(int index)
            {
                    int ql = Tree[index].l,qr = Tree[index].r;
                    int mid = (ql + qr) >> 1;
                    if (ql == qr) return;
                    if (Tree[index].tag == 0)
                    {
                            Tree[index<<1].lm = Tree[index<<1].rm = Tree[index<<1].mx = mid - ql + 1;
                            Tree[index<<1|1].lm = Tree[index<<1|1].rm = Tree[index<<1|1].mx = qr - mid;
                            Tree[index<<1].tag = Tree[index<<1|1].tag = 0;
                            Tree[index].tag = -1;
                    }
                    if (Tree[index].tag == 1)
                    {
                            Tree[index<<1].lm = Tree[index<<1].rm = Tree[index<<1].mx = 0;
                            Tree[index<<1|1].lm = Tree[index<<1|1].rm = Tree[index<<1|1].mx = 0;
                            Tree[index<<1].tag = Tree[index<<1|1].tag = 1;
                            Tree[index].tag = -1;
                    }
            }
            inline void update(int index)
            {
                    int ql = Tree[index].l,qr = Tree[index].r;
                    int mid = (ql + qr) >> 1;
                    if (Tree[index<<1].lm == mid - ql + 1) Tree[index].lm = Tree[index<<1].lm + Tree[index<<1|1].lm;
                    else Tree[index].lm = Tree[index<<1].lm;
                    if (Tree[index<<1|1].rm == qr - mid) Tree[index].rm = Tree[index<<1|1].rm + Tree[index<<1].rm;
                    else Tree[index].rm = Tree[index<<1|1].rm;
                    Tree[index].mx = max(max(Tree[index<<1].mx,Tree[index<<1|1].mx),Tree[index<<1].rm+Tree[index<<1|1].lm);
            }
            inline void modify(int index,int l,int r,int val)
            {
                    int mid,ql,qr;
                    if (Tree[index].l == l && Tree[index].r == r)
                    {
                            Tree[index].lm = Tree[index].rm = Tree[index].mx = (val ^ 1) * (r - l + 1);
                            Tree[index].tag = val;
                    } else
                    {
                            pushdown(index);
                            ql = Tree[index].l;
                            qr = Tree[index].r;
                            mid = (ql + qr) >> 1;
                            if (mid >= r) modify(index<<1,l,r,val);
                            else if (mid + 1 <= l) modify(index<<1|1,l,r,val);
                            else 
                            {
                                    modify(index<<1,l,mid,val);
                                    modify(index<<1|1,mid+1,r,val);
                            }
                            update(index);
                    }
            }
            inline int query_pos(int index,int d)
            {
                    int mid,ql,qr;
                    ql = Tree[index].l; qr = Tree[index].r;
                    mid = (ql + qr) >> 1;
                    if (ql == qr) return ql;
                    pushdown(index);
                    if (Tree[index<<1].mx >= d) return query_pos(index<<1,d);
                    else if (Tree[index<<1].rm + Tree[index<<1|1].lm >= d) return mid - Tree[index<<1].rm + 1;
                    else return query_pos(index<<1|1,d);
            }
            inline int query()
            {
                    return Tree[1].mx;
            }
    } T;
    
    template <typename T> inline void read(T &x)
    {
        int f = 1; x = 0;
        char c = getchar();
        for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
        for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
        x *= f;
    }
    template <typename T> inline void write(T x)
    {
        if (x < 0)
        {
            putchar('-');
            x = -x;
        }
        if (x > 9) write(x/10);
        putchar(x%10+'0');
    }
    template <typename T> inline void writeln(T x)
    {
        write(x);
        puts("");
    }
    
    int main() {
            
            read(n); read(m);
            T.build(1,1,n);
            while (m--)
            {
                    read(opt);
                    if (opt == 1)
                    {
                            read(d);
                            if (T.query() < d) writeln(0);
                            else 
                            {
                                    pos = T.query_pos(1,d);
                                    writeln(pos);
                                    T.modify(1,pos,pos+d-1,1);
                            }
                    } else
                    {
                            read(x); read(d);
                            T.modify(1,x,x+d-1,0);
                    }
            }
            
            return 0;
        
    }
  • 相关阅读:
    项目中常用的19条MySQL优化技巧
    集群的session问题解决方案
    nginx实现多个域名共享80端口
    spring-boot-maven-plugin多模块install问题解决办法
    JAVA-基础(十) Swing
    JAVA-基础(六) Java.serialization 序列化
    JAVA-基础(六) Java.io
    JAVA 基础--开发环境IDEA 搭建
    JAVA-基础(五) 更多工具集
    JAVA-基础(四) Aarryas 数组
  • 原文地址:https://www.cnblogs.com/evenbao/p/9196305.html
Copyright © 2011-2022 走看看