zoukankan      html  css  js  c++  java
  • vijos1782:借教室

    描述

    在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。

    面对海量租借教室的信息,我们自然希望编程解决这个问题。我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借。共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室。 
    我们假定,租借者对教室的大小、地点没有要求。即对于每份订单,我们只需要每天提供dj个教室,而它们具体是哪些教室,每天是否是相同的教室则不用考虑。

    借教室的原则是先到先得,也就是说我们要按照订单的先后顺序依次为每份订单分配教室。如果在分配的过程中遇到一份订单无法完全满足,则需要停止教室的分配,通知当前申请人修改订单。这里的无法满足指从第sj天到第tj天中有至少一天剩余的教室数量不足dj个。

    现在我们需要知道,是否会有订单无法完全满足。如果有,需要通知哪一个申请人修改订单。

    格式

    输入格式

    第一行包含两个正整数n,m,表示天数和订单的数量。 
    第二行包含n个正整数,其中第i个数为ri,表示第i天可用于租借的教室数量。 
    接下来有m行,每行包含三个正整数dj,sj,tj,表示租借的数量,租借开始、结束分别在第几天。 
    每行相邻的两个数之间均用一个空格隔开。天数与订单均用从1开始的整数编号。

    输出格式

    如果所有订单均可满足,则输出只有一行,包含一个整数0。否则(订单无法完全满足)输出两行,第一行输出一个负整数-1,第二行输出需要修改订单的申请人编号。

    输入:

    4 3 
    2 5 4 3 
    2 1 3 
    3 2 4 
    4 2 4

    输出:

    -1

    2

    思路:线段树+输入优化。

    #include <stdio.h>
    #include <algorithm>
    using namespace std;
    const int MAXN=1000005;
    struct Node{
        int l,r,mn,lazy;
    }a[MAXN*4];
    void inline read(int &x)
    {
        x=0;
        char ch=getchar();
        while(ch<'0'||'9'<ch)
        {
            ch=getchar();
        }
        while('0'<=ch&&ch<='9')
        {
            x*=10;
            x+=(ch-'0');
            ch=getchar();
        }
    }
    bool mark;
    void build(int rt,int l,int r)
    {
        a[rt].l=l;
        a[rt].r=r;
        a[rt].lazy=0;
        if(l==r)
        {
            a[rt].lazy=0;
            read(a[rt].mn);
            return ;
        }
        int mid=(l+r)>>1;
        build(rt<<1,l,mid);
        build((rt<<1)|1,mid+1,r);
        a[rt].mn=min(a[rt<<1].mn,a[(rt<<1)|1].mn);
    }
    void pushDown(int rt)
    {
        int la=a[rt].lazy;
        a[rt<<1].mn+=la;
        a[rt<<1].lazy+=la;
        a[(rt<<1)|1].mn+=la;
        a[(rt<<1)|1].lazy+=la;
        a[rt].lazy=0;
    }
    void update(int rt,int l,int r,int val)
    {
        if(a[rt].l==l&&a[rt].r==r)
        {
            a[rt].mn+=val;
            a[rt].lazy+=val;
            if(a[rt].mn<0)
            {
                mark=false;
            }
            return ;
        }
        if(a[rt].lazy)
        {
            pushDown(rt);
        }
        int mid=(a[rt].l+a[rt].r)>>1;
        if(r<=mid)
        {
            update(rt<<1,l,r,val);
        }
        else if(mid<l)
        {
            update((rt<<1)|1,l,r,val);
        }
        else
        {
            update(rt<<1,l,mid,val);
            update((rt<<1)|1,mid+1,r,val);
        }
        a[rt].mn=min(a[rt<<1].mn,a[(rt<<1)|1].mn);
    }
    int n,m;
    struct Room{
        int d,l,r;
    }room[MAXN];
    int main()
    {
        mark=true;
        read(n);
        read(m);
        build(1,1,n);
        for(int i=0;i<m;i++)
        {
            read(room[i].d);
            read(room[i].l);
            read(room[i].r);
        }
        int k;
        for(int i=0;i<m;i++)
        {    
            update(1,room[i].l,room[i].r,-room[i].d);    
            if(mark==false)
            {
                k=i+1;
                break;
            }
        }
        if(mark)    printf("0
    ");
        else printf("-1
    %d
    ",k);
        return 0;
    }
  • 相关阅读:
    Java并发编程笔记——技术点汇总
    Hello Blog
    shell变量
    认识bash这个shell
    使用myeclipse创建带注解的model实体类
    python List,切片的用法
    ignite从0到1的学习过程记录-第一篇:安装和体验
    安卓Service完全解析(中)
    安卓Service完全解析(上)
    JAVA之数组
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5676955.html
Copyright © 2011-2022 走看看