2017-04-04 水题信心 01宾馆房间

Description

2180 年奥运会竞技类分会场,将在 XX 市举行。会场自然是政府的事情,我们就别操心了。艾瑞克却被兴奋而苦恼的情绪折磨着,他的宾馆是 XX 市最好的宾馆,近期旅客投宿的订单 m 份接踵而至,时间从 1~n 天,这代表着大把大把的银子,可是他最多只能提供 k 间客房,更多的他只能提前去租附近的房子并赶紧装修一下,时间很紧啊。
艾瑞克找到了他最好的朋友你:“哪,这是所有的订单,你给我在 1s 内计算出最高峰时,超出多少间客房,这样我才能知道得去租多少房子啊。”每张订单包含 dj,sj,tj:表示从第 sj 日至第 tj 日,预定房间 dj 间。
注:为了简单起见,假设第一天之前宾馆所有的房间都是空的。

Input

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

Output

只有一个整数,表示最高峰时还差多少客房,客房足够输出 0(骗不到分)。

Sample Input

4 3 6
2 1 3
3 2 4
4 2 4

Sample Output

3

Hint

1<=n,m<=1000,000;1<=sj<=tj<=n;1<=k,dj<=1000;
输入数据较大,最好加外挂

题解

维护一个数组c,如果第x~y天增加了z个房间,那么c[x]+z,c[y+1]-z。
前缀和就是当天的房间数量。
(真水)

#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

inline int read(){
    int x  = 0, f = 1; char c = getchar();
    while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
    while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
    return x * f;
}

const int N = 1000000 + 10;
int c[N];
int n, m, k;

void init(){
    n = read(); m = read(); k = read();
}

void work(){
    int ans = 0;
    int x, y, z, s = 0;
    for(int i = 1; i <= m; i++){
        x = read(); y = read(); z = read();
        c[y] += x; c[z+1] -= x;
    }
    for(int i = 1; i <= n; i++)
        s += c[i], ans = max(ans, s - k);
    printf("%d\n", ans);
}

int main(){
    freopen("hotelroom.in", "r", stdin);
    freopen("hotelroom.out", "w", stdout);
    init();
    work();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值