题目

[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. c++ 父类 子类 虚表占用内存空间情况

    #include <iostream> using namespace std; class C {}; class A:public C { private: long a; long ...

  2. 如何用js得到当前页面的url信息方法

    设置或获取对象指定的文件名或路径. alert(window.location.pathname) 设置或获取整个 URL 为字符串. alert(window.location.href); 设置或 ...

  3. [剑指 Offer 28. 对称的二叉树]

    剑指 Offer 28. 对称的二叉树 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / ...

  4. noi linux 2.0 体验

    一.起因 下午,我打开 noi 官网准备报名 csp j/s,一看官网展板:"noi linux 2.0 发布" 我就兴奋了起来.(9 月 1 日起开始使用, 也就意味着 csp ...

  5. linux命令打基础

    目录 一.shell概述 二.linux命令分类 三.linux命令行 3.1 格式 3.2 编辑Linux命令行 四.Linux基础命令 4.1 pwd:查看当前的工作目录 4.2 cd:切换工作目 ...

  6. Linux必知必会的命令全集(持续更新)

    Linux有超过五百多种命令,每个命令还有十几二十种选项,令人抓狂,本文旨在整理本人工作常用的Linux命令,希望对大家有所帮助! 1.cd 跳转文件夹 最常用的命令,没有之一. cd    # 进入 ...

  7. TCP 才不傻!

    大家好,我是小林. 之前收到个读者的问题,对于 TCP 三次握手和四次挥手的一些疑问: 第一次握手,如果客户端发送的SYN一直都传不到被服务器,那么客户端是一直重发SYN到永久吗?客户端停止重发SYN ...

  8. 嵌入式Linux可用的防火墙——iptables:实现ip白名单、mac地址白名单

    iptables是linux系统下的一个功能强大的模块,不仅可以用作防火墙,还可以实现NAT等众多路由功能.iptables的容器有很清晰的层次关系: 1. iptables是表的容器,iptable ...

  9. STM32—串口通讯详解

    串口通讯目录 物理层 协议层 USART简介 开发板与上位机的连接 代码讲解: 一.初始化结构体 二.NVIC配置中断优先级 三.USART配置函数讲解 四.传输数据的函数: 1.发送一个字节 2.发 ...

  10. 狂神说SpringBoot02:运行原理初探

    狂神说SpringBoot系列连载课程,通俗易懂,基于SpringBoot2.2.5版本,欢迎各位狂粉转发关注学习. 微信公众号:狂神说(首发)    Bilibili:狂神说Java(视频) 未经作 ...