洛谷P1083 借教室 题解
题目
题解
这道题是几周之前做到的一道题,本来不想讲的,因为这道题也是用到了二分答案的方法,这类题目之前已经发布过两篇题解了。但这道题还运用了差分数组这个思想,所以我觉得还是值得讲一讲的。
首先,什么是差分数组呢?就是对于某一个数组,每两个相邻元素的差值组成的新的数组。比如对于数组 \(a[4]=[1,4,2,6]\) ,其差分数组即为 \([0,3,-2,4]\) (首元素设为0方便解题)。
所以回到这道题,我们该如何获取每天所需要的教室呢?暴力求解最坏复杂度高达 \(O(mn)\) ,这显然是不行的,所以要用到差分数组的思想。对于原数组每个区间 \([s,t]\) 的所有元素都增加 \(d\) ,差分数组 \(diff\) 是如何变化呢?很简单
\]
想一想是不是,除了这两个元素其他值都是保持不变的。求出 \(diff\) 数组后求出原数组就很容易的,原数组 \(need\) 的表达式即为
\]
复杂度只有 \(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 借教室 题解的更多相关文章
- 洛谷 P1083 借教室 题解
P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...
- 洛谷P1083借教室题解
题目 这个难度感觉并没有那么高,因为这个题暴力也好打,但是比较难想出正解,因为如果你不看标签是很难想到这个题竟然是二分,当然前缀和应该很好想,毕竟让你求的是在某段时间内借教室的和是否满足. 这样我们可 ...
- 【题解】洛谷 P1083 借教室
目录 题目 思路 \(Code\) 题目 P1083 借教室 思路 线段树.需要的操作为区间修改,区间查询.维护每个区间的最小值就好. \(Code\) #include<iostream> ...
- 洛谷P1083 借教室
P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...
- 『题解』洛谷P1083 借教室
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 在大学期间,经常需要租借教室.大到院系举办活动,小到 ...
- NOIP2012 洛谷P1083 借教室
传送门 题意:有一些学(xian)生(quan)要借教室.在n天内,第i天学校有ri个教室.有m份订单,每份订单有三个数值dj,sj,tj,分别表示这个订单从第sj天开始到第tj天结束(包括端点),每 ...
- [NOIP2012] 提高组 洛谷P1083 借教室
题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...
- 洛谷 P1083 借教室【二分+差分/线段树】
二分mid,然后用1~mid的操作在差分序列上加减,最后把差分序列前缀和起来,看是否有有超过初始r值的 #include<iostream> #include<cstdio> ...
- VIjos——V 1782 借教室 | | 洛谷——P1083 借教室
https://vijos.org/p/1782|| https://www.luogu.org/problem/show?pid=1083 描述 在大学期间,经常需要租借教室.大到院系举办活动,小到 ...
随机推荐
- C++调试总结
一.参考: 本文主要参考<C++编程调试秘笈>一书. 在编写C++代码时,我们不应该自己捕捉缺陷,而是由编译器和可执行代码为我们做这些事情,该书便提供了这样的一个思考.作者以"调 ...
- 破解加速乐-java
记录一哈自己遇到的简单站点的破解 Talk is cheap,show you the code! import com.google.gson.Gson; import com.google.gso ...
- OpenGL学习笔记(二)画三角形
目录 渲染管线(Graphics Pipeline) 编码实现 顶点数据 顶点缓冲对象(VBO) 顶点着色器 编译着色器 片段着色器 着色器程序 链接顶点属性 顶点数组对象 最终绘制三角形 索引缓冲对 ...
- appium的安装和环境配置教程
模拟器安装 夜神模拟器下载地址:https://www.yeshen.com/ 无脑安装 jdk环境 安装jdk 安装教程:https://www.cnblogs.com/yhoil/p/148086 ...
- 大厂Android岗高频面试问题:说说你对Zygote的理解!
前言 Zygote可以说是Android开发面试很高频的一道问题,但总有小伙伴在回答这道问题总不能让面试满意, 在这你就要搞清楚面试问你对Zygote的理解时,面试官最想听到的和其实想问的应该是哪些? ...
- 干了六年Android开发现在裸辞失业了,再过2个月就30了,该怎么继续生活?
这是我在某论坛看到别人分享的故事,觉得可以展开聊一下,对于我们这些中年程序员,可以裸辞吗? 前言 首先介绍一下主人公的情况.目前所在的是一家小的创业公司,待了3年多,薪资一般吧,之前在一家中型上市企业 ...
- clickhouse的windowFunnel(漏斗)
1.WindowFunnel 关于官网的解释: Returned value:Integer. The maximum number of consecutive triggered conditio ...
- perfdog的基本使用
perfdog的下载安装就不做过多介绍了,直接进入正题,首先介绍下perfdog页面的结构 如下图 1.显示连接的设备 2.选择需要测试的app 3.device tab下显示设备的基本信息,sett ...
- python-scrapy框架学习
Scrapy框架 Scrapy安装 正常安装会报错,主要是两个原因 0x01 升级pip3包 python -m pip install -U pip 0x02 手动安装依赖 需要手动安装 wheel ...
- Vue3 Composition API写烦了,试试新语法糖吧—setup script
前言 Vue3发布近一年了,相信大家对Vue3的新特性,新语法都很熟悉了.那么在使用Composition API的过程中,有没有觉得整个过程比较繁琐.比如你的模板里用到了大量的state和方法的时候 ...