题目

[NOIP2012 提高组] 借教室

题解

这道题是几周之前做到的一道题,本来不想讲的,因为这道题也是用到了二分答案的方法,这类题目之前已经发布过两篇题解了。但这道题还运用了差分数组这个思想,所以我觉得还是值得讲一讲的。

首先,什么是差分数组呢?就是对于某一个数组,每两个相邻元素的差值组成的新的数组。比如对于数组 \(a[4]=[1,4,2,6]\) ,其差分数组即为 \([0,3,-2,4]\) (首元素设为0方便解题)。

所以回到这道题,我们该如何获取每天所需要的教室呢?暴力求解最坏复杂度高达 \(O(mn)\) ,这显然是不行的,所以要用到差分数组的思想。对于原数组每个区间 \([s,t]\) 的所有元素都增加 \(d\) ,差分数组 \(diff\) 是如何变化呢?很简单

\[diff[s]+=d, diff[t+1]-=d
\]

想一想是不是,除了这两个元素其他值都是保持不变的。求出 \(diff\) 数组后求出原数组就很容易的,原数组 \(need\) 的表达式即为

\[need[i]=need[i-1]+diff[i]
\]

复杂度只有 \(O(m+n)\) 。然后再将每天的需求量与现有量比较,如果都满足,则直接输出 \(0\) ,否则运用二分答案,同样运用差分数组的方法找到第一个无法满足的订单,即为所需答案。程序总的复杂度为 \(O((m+n)\cdot logm)\) 。

代码

#include<iostream>
#include<cstring>
using namespace std;
int* rest, * need;
int diff[1000002];
int *d, *s, *t;
int n, m; bool ifcan(int x)
{
memset(diff, 0, sizeof(diff));
for (int i = 0; i < x; i++)
{
diff[t[i] + 1] -= d[i];
diff[s[i]] += d[i];
}
for (int i = 1; i <= n; i++)
{
need[i] = need[i - 1] + diff[i];
if (need[i] > rest[i])
return 0;
}
return 1;
} int main()
{
cin >> n >> m;
rest = new int[n + 1],need = new int[n + 1];
d = new int[m], s = new int[m], t = new int[m];
need[0] = 0;
for (int i = 1; i <= n; i++)
scanf("%d", &rest[i]);
for (int i = 0; i < m; i++)
{
scanf("%d%d%d", &d[i], &s[i], &t[i]);
}
if (!ifcan(m))
{
cout << -1 << endl;
int l = 1, r = m;
int mid;
while (l < r)
{
mid = (l + r) / 2;
if (ifcan(mid))
l = mid + 1;
else
r = mid;
}
cout << r;
}
else
cout << 0;
return 0;
}

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

  1. 洛谷 P1083 借教室 题解

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

  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. [JS]函数作为值

    在JavaScript中,函数不仅是语法,也是值.这意味着可以把函数赋值给变量.保存为对象的属性或者数组的元素.作为参数传给其他函数. 将函数赋值给变量s,实际上变量引用的是函数对象.不仅可以通过函数 ...

  2. Mybatis学习笔记-第一个Mybatis程序

    思路 搭建环境 搭建数据库(略) CREATE DDATABASE CREATE TABLE INSERT VALUES 新建项目 普通Maven项目 删除src文件夹 --> 建立父工程 导入 ...

  3. WPF DataGrid DataGridTextColumn

    Style设置时,无法绑定到数据,需要这样写 1 <DataGridTextColumn Header="呵呵" Binding="{Binding ID}&quo ...

  4. Java互联网架构师系统进阶课程学习 (4)【享学】

    Java互联网架构师系统进阶课程学习 (4)[享学] 4.显式锁和AQS   显式锁 Lock接口和核心方法 Lock接口和synchronized的比较 synchronized 代码简洁,Lock ...

  5. 【工作篇】再次熟悉 SpringMVC 参数绑定

    前言 主要现在项目中使用的参数绑定五花八门的,搞得很头大,例如有些用字符串接收日期,用字符串接受数组等等,完全没有利用好 SpringMVC 的优势,这里自己也总结一下,免得到时又要百度谷歌查找. 以 ...

  6. centos7.5 安装jdk环境

    最新下载地址 历史下载地址 [root@manage ~]# mkdir /application/ [root@manage ~]# tar -xf jdk-8u112-linux-x64.gz - ...

  7. SQL 练习28

    查询平均成绩大于等于 85 的所有学生的学号.姓名和平均成绩 SELECT Student.SId,Student.Sname,平均成绩 FROM Student , (SELECT sid,AVG( ...

  8. 题解 Smooth

    传送门 咕了蚯蚓这题+前一天被蚊子折腾了半宿没睡=全场几乎就我这题分最低-- 发现这里光滑数是不断乘出来的--记得这是一个很经典的套路,然而当时我咕了 求一个每个值都是 \(\{p_i\}\) 中至少 ...

  9. 黑马JVM教程——自学笔记(三)

    四.类加载与字节码技术 4.1.类文件结构 首先获得.class字节码文件 方法: 在文本文档里写入java代码(文件名与类名一致),将文件类型改为.java java终端中,执行javac X:.. ...

  10. 聊一聊中台和DDD(领域驱动设计)

    本次分享价值:本次分享主要针对中台.微服务和领域模型的理念.本质及其构建方法论进行探讨.对领域分析的价值所在就是寻求"千变万化"中相对的"稳定性.第一性",然后 ...