题目

[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. 使用分区助手转移windows 10系统出现黑屏boot manager报错问题。

    问题原因: 在使用分区助手迁移windows 10到ssd中,设置完boot管理器后,出现黑屏问题, 经过长时间的搜索,发现在迁移系统的时候,只迁移了C盘的系统,没有连同msr引导 文件一同传过去,会 ...

  2. Nexus Repository Manager 3 远程命令执行漏洞(CVE-2019-7238)

    poc地址 https://github.com/magicming200/CVE-2019-7238_Nexus_RCE_Tool

  3. 使用 GLFW 在 OpenGL 的场景中漫游

    前言 前面已经建立了 OpenGL 框架,加载了 3D 模型,但是还没有在场景中漫游的功能.为了展示 3D 模型,我只是简单地利用变换视图矩阵的方式使模型在视野中旋转.同时,之前的程序连最简单的改变窗 ...

  4. Python的round()函数与数学的四舍五入的区别

    print(round(0.5))>>0print(round(1.5))>>2print(round(2.5))>>2整数部分为偶 小数为0.5 向下取整 0也是 ...

  5. Compile Java Codes in Linux Shell instead of Ant Script

    The following is frequently used ant script, compile some java source codes with a libary path, then ...

  6. 计算机专业学了快一年, 只会一点C语言,你好意思说自己是IT专业的?

    目录 一.C/C++入门阶段 学习视频推荐:C++入门基础[B站 小甲鱼] 二.C/C++开发进阶 学习视频推荐:C++进阶[慕课网 免费课] 三.C++开发高级 视频教程:程序设计[中国大学MOOC ...

  7. SpringBoot开发六-发送邮件

    需求介绍-发送邮件 首先要进行邮箱设置,要启用客户端SMTP服务. 而且SpringBoot也给了JavaMailSender发送邮件. 代码实现 首先你需要设置好邮箱,步骤百度一大堆,记住要配置一个 ...

  8. python-scrapy框架学习

    Scrapy框架 Scrapy安装 正常安装会报错,主要是两个原因 0x01 升级pip3包 python -m pip install -U pip 0x02 手动安装依赖 需要手动安装 wheel ...

  9. VsCode安装使用教程和插件安装方法

    许多渗透方式都python写脚本,比较方便,写一下vscode和插件的安装办法,虽然不是很复杂,但是写一下做一下笔记: Visual Studio Code (简称 VS Code / VSC) 是一 ...

  10. MATLAB批量存储图像和显示算法处理的图像不留空白

    一 前言 最近收到审稿人的修改意见,其中一条为<RC: There were only five images evaluated in the experiment, and I recomm ...