P1083 借教室

题目描述

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

面对海量租借教室的信息,我们自然希望编程解决这个问题。

我们需要处理接下来nn天的借教室信息,其中第\(i\)天学校有\(r_i\)​个教室可供租借。共有\(m\)份订单,每份订单用三个正整数描述,分别为\(d_j,s_j,t_j\)​,表示某租借者需要从第\(s_j\)​天到第\(t_j\)天租借教室(包括第\(s_j\)​天和第\(t_j\)​天),每天需要租借\(d_j\)​个教室。

我们假定,租借者对教室的大小、地点没有要求。即对于每份订单,我们只需要每天提供\(d_j\)​个教室,而它们具体是哪些教室,每天是否是相同的教室则不用考虑。

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

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

输入格式

第一行包含两个正整数\(n,m\),表示天数和订单的数量。

第二行包含\(n\)个正整数,其中第\(i\)个数为\(r_i\)​,表示第ii天可用于租借的教室数量。

接下来有\(m\)行,每行包含三个正整数\(d_j,s_j,t_j\),表示租借的数量,租借开始、结束分别在第几天。

每行相邻的两个数之间均用一个空格隔开。天数与订单均用从\(1\)开始的整数编号。

输出格式

如果所有订单均可满足,则输出只有一行,包含一个整数\(0\)。否则(订单无法完全满足)

输出两行,第一行输出一个负整数\(-1\),第二行输出需要修改订单的申请人编号。

输入输出样例

输入 #1

4 3

2 5 4 3

2 1 3

3 2 4

4 2 4

输出 #1

-1

2

说明/提示

【输入输出样例说明】

第 \(1\)份订单满足后,\(4\)天剩余的教室数分别为 \(0,3,2,3\)。第 \(2\) 份订单要求第 \(2\)天到第 \(4\) 天每天提供\(3\)个教室,而第 \(3\)天剩余的教室数为\(2\),因此无法满足。分配停止,通知第\(2\) 个申请人修改订单。

【数据范围】

对于10%的数据,有\(1≤ n,m≤ 10\);

对于30%的数据,有\(1≤ n,m≤100\);

对于 70%的数据,有\(1 ≤ n,m ≤ 10^5\);

对于 100%的数据,有\(1 ≤ n,m ≤ 10^6,0 ≤ r_i,d_j≤ 10^9,1 ≤ s_j≤ t_j≤ n\)。

NOIP 2012 提高组 第二天 第二题strong text

【思路】

二分答案 + 差分

暴力枚举只有45分

不过可以二分前多少个能够成功借到教室

因为有一个很显然的特征

如果第i个可以成功借到教室

那么第i - 1个也一定可以成功借到教室

所以二分起来是可以的

不用担心二分变换r和l的值得时候前面的是是不能够借到教室的

不过这个check暴力该也是不可行的

是可以用差分数组

修改区间的时候只需要修改两个点就可以了

将二分出来的前mid个订单

按照要求的时间在差分数组上面修改一下

然后跑一遍前缀和求出每个点需要提供多少个教室

同时和之前输入的每天能够提供的教室的数量比较一下

如果有大于能够提供的教室的数量的

那就返回假

到最后都没有的话那就返回真

注意在开始二分前

应该先check一下m合不合法

也就是能不能全部安排完

【完整代码】

#include<iostream>
#include<cstring>
#include<cstdio>
#define int long long using namespace std;
const int Max = 1000005;
struct node
{
int d,s,t;
}a[Max];
int r[Max];
int c[Max];
int n,m; bool check(int x)
{
memset(c,0,sizeof(c));
for(register int i = 1;i <= x;++ i)
{
c[a[i].s] += a[i].d;
c[a[i].t + 1] -= a[i].d;
}
int last = 0,now;
for(register int i = 1;i <= n;++ i)
{
now = last + c[i];
if(now > r[i])return false;
last = now;
}
return true;
} signed main()
{
cin >> n >> m;
for(register int i = 1;i <= n;++ i)
cin >> r[i];
for(register int i = 1;i <= m;++ i)
cin >> a[i].d >> a[i].s >> a[i].t;
int l = 0,r = m;
if(check(m) == true){cout << 0 <<endl;return 0;}
while(l < r)
{
int mid = (l + r) >> 1;
if(check(mid))l = mid + 1;
else r = mid;
}
cout << -1 << endl << l << endl;
return 0;
}

洛谷 P1083 借教室 题解的更多相关文章

  1. 洛谷P1083 借教室 题解

    题目 [NOIP2012 提高组] 借教室 题解 这道题是几周之前做到的一道题,本来不想讲的,因为这道题也是用到了二分答案的方法,这类题目之前已经发布过两篇题解了.但这道题还运用了差分数组这个思想,所 ...

  2. 洛谷P1083借教室题解

    题目 这个难度感觉并没有那么高,因为这个题暴力也好打,但是比较难想出正解,因为如果你不看标签是很难想到这个题竟然是二分,当然前缀和应该很好想,毕竟让你求的是在某段时间内借教室的和是否满足. 这样我们可 ...

  3. 【题解】洛谷 P1083 借教室

    目录 题目 思路 \(Code\) 题目 P1083 借教室 思路 线段树.需要的操作为区间修改,区间查询.维护每个区间的最小值就好. \(Code\) #include<iostream> ...

  4. 洛谷P1083 借教室

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

  5. 『题解』洛谷P1083 借教室

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 在大学期间,经常需要租借教室.大到院系举办活动,小到 ...

  6. NOIP2012 洛谷P1083 借教室

    传送门 题意:有一些学(xian)生(quan)要借教室.在n天内,第i天学校有ri个教室.有m份订单,每份订单有三个数值dj,sj,tj,分别表示这个订单从第sj天开始到第tj天结束(包括端点),每 ...

  7. [NOIP2012] 提高组 洛谷P1083 借教室

    题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...

  8. 洛谷 P1083 借教室【二分+差分/线段树】

    二分mid,然后用1~mid的操作在差分序列上加减,最后把差分序列前缀和起来,看是否有有超过初始r值的 #include<iostream> #include<cstdio> ...

  9. VIjos——V 1782 借教室 | | 洛谷——P1083 借教室

    https://vijos.org/p/1782|| https://www.luogu.org/problem/show?pid=1083 描述 在大学期间,经常需要租借教室.大到院系举办活动,小到 ...

随机推荐

  1. MVC4 部署 could not load file or assembly system.web.http.webhost 或是其它文件出误

    自从VS2010发布之后使用它来做开发的程序员越来越多,其中很多人使用了MVC来作为新的开发框架,但是在系统部署的时候我们也遇到诸多问题,因为目前大多数windows服务器采用的还是Windows S ...

  2. 原生JS获取HTML DOM元素的8种方法

    JS获取DOM元素的方法(8种) 通过ID获取(getElementById) 通过name属性(getElementsByName) 通过标签名(getElementsByTagName) 通过类名 ...

  3. jQuery将form表单的数据封装成json对象

    /** * 自动将form表单封装成json对象 */ $.fn.serializeObject = function() { var o = {}; var a = this.serializeAr ...

  4. ceph 接入OpenStack

    创建对应的pool: ceph osd pool create volumes 512 ceph osd pool create images 512 ceph osd pool create vms ...

  5. mysql遇到时区问题的坑(Java解决方案)

    最近项目遇到一个坑,就是server和db之间存在时区问题,本人的db是utc时间, 可以使用代码设置时区来解决,本人这里使用joda三方包,joda蛮好用的,具体用法这里不做详细描述. 先引入pom ...

  6. 7. Input and Output

    7. Input and Output There are several ways to present the output of a program; data can be printed i ...

  7. 阿里云ECS部署maven项目

    1.配置JDK和tomcat: https://www.cnblogs.com/congcongdi/p/11227771.html 2.使用eclipse打包项目 在项目上点击右键-->run ...

  8. Linux操作系统的文件查找工具locate和find命令常用参数介绍

    Linux操作系统的文件查找工具locate和find命令常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.非实时查找(数据库查找)locate工具  locate命 ...

  9. Docker容器化技术(下)

    Docker容器化技术(下) 一.Dockerfile基础命令 1.1.FROM - 基于基准镜像 FROM centos #制作基准镜像(基于centos) FROM scratch #不依赖任何基 ...

  10. Linux系统下文件压缩与打包命令

    Linux系统下文件压缩与打包命令 常用的压缩文件拓展名 * .Z * .zip * .gz * .bz2 * .xz * .tar * .tar.gz * .tar.bz2 * .tar.xz 压缩 ...