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

     借教室

    TimeLimit:3000MS  MemoryLimit:128MB
    64-bit integer IO format:%lld
    Problem Description

    在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。 面对海量租借教室的信息,我们自然希望编程解决这个问题。 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借。共有m份订单,每份订单用三个正整数描述,分别为dj , sj ,tj,表示某租借者需要从第sj天到第tj天租 借教室(包括第sj天和第tj天),每天需要租借dj个教室。 我们假定,租借者对教室的大小、地点没有要求。即对于每份订单,我们只需要每天提 供dj个教室,而它们具体是哪些教室,每天是否是相同的教室则不用考虑。 借教室的原则是先到先得,也就是说我们要按照订单的先后顺序依次为每份订单分配教室。如果在分配的过程中遇到一份订单无法完全满足,则需要停止教室的分配,通知当前申请人修改订单。这里的无法满足指从第sj天到第tj天中有至少一天剩余的教室数量不足dj个。 现在我们需要知道,是否会有订单无法完全满足。如果有,需要通知哪一个申请人修改订单。

    Input

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

    1 ≤ n,m ≤ 10^6,0 ≤ ri,dj ≤ 10^9,1 ≤ sj ≤ tj ≤ n。 

    Output

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

    SampleInput
    4 3
    2 5 4 3
    2 1 3
    3 2 4
    4 2 4
    SampleOutput
    -1
    2
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 const int maxn = 1000000+20;
     6 int a[maxn];
     7 struct node
     8 {
     9     int l,r,Min,lazy;
    10 } T[maxn*4];
    11 int n,m,flag,lie;
    12 int ans=0;
    13 void build(int v,int l,int r)
    14 {
    15     T[v].l=l,T[v].r=r;
    16     if(l==r)
    17     {
    18         T[v].Min=a[l];
    19         return ;
    20     }
    21     int mid = (l+r)>>1;
    22     build(v<<1,l,mid);
    23     build(v<<1|1,mid+1,r);
    24     T[v].Min=min(T[v<<1].Min,T[v<<1|1].Min);
    25 }
    26 void add(int v,int l,int r,int value)
    27 {
    28     if(T[v].l==l&&T[v].r==r)
    29     {
    30         T[v].Min-=value;
    31         T[v].lazy+=value;
    32         if(T[v].Min<0)
    33             flag=1;
    34         return ;
    35     }
    36     int mid=(T[v].l+T[v].r)>>1;
    37     if(T[v].lazy)
    38     {
    39         T[v<<1].Min-=T[v].lazy;
    40         T[v<<1|1].Min-=T[v].lazy;
    41         T[v<<1].lazy+=T[v].lazy;
    42         T[v<<1|1].lazy+=T[v].lazy;
    43         T[v].lazy=0;
    44     }
    45     if(r<=mid)
    46     {
    47         add(v<<1,l,r,value);
    48     }
    49     else
    50     {
    51         if(l>mid)
    52         {
    53             add(v<<1|1,l,r,value);
    54         }
    55         else
    56         {
    57             add(v<<1,l,mid,value);
    58             add(v<<1|1,mid+1,r,value);
    59         }
    60     }
    61     T[v].Min=min(T[v<<1].Min,T[v<<1|1].Min);
    62 }
    63 int main()
    64 {
    65     scanf("%d%d",&n,&m);
    66     for(int i=1; i<=n; i++)
    67         scanf("%d",&a[i]);
    68     build(1,1,n);
    69     for(int i=1; i<=m; i++)
    70     {
    71         int num,l,r;
    72         scanf("%d%d%d",&num,&l,&r);
    73         if(flag)
    74             continue;
    75         add(1,l,r,num);
    76         if(flag)
    77         {
    78             lie=i;
    79         }
    80     }
    81     if(lie)
    82     {
    83         puts("-1");
    84         printf("%d
    ",lie);
    85     }
    86     else
    87         printf("0
    ");
    88     return 0;
    89 }
  • 相关阅读:
    如何让一个浮动垂直居中:两种方式!带来效果~~~~~~
    rgba()和opacity之间的区别(面试题)
    常用浏览器内核!IE,Chrome ,Firefox,Safari,Opera 等内核
    有关Option.inSamplSize 和 Compress 图片压缩
    Android App 启动 Activity 创建解析
     (转)windows一台电脑添加多个git账号
    Handler向子线程发送数据
    Android Touch事件分发
    int 转十六进制
    JVM client模式和Server模式
  • 原文地址:https://www.cnblogs.com/xcantaloupe/p/8506517.html
Copyright © 2011-2022 走看看