【洛谷P1083】[NOIP2012]借教室
借教室
【题目描述】
在n天中每天有一个可以借出的教室数,有m个订单,每个订单从第l天到第r天要借用x个教室。问能否满足所有的订单,若不能,输出第一个不能满足的订单编号。
思路:
1.1 ≤ n,m ≤ 10^6,区间的整体修改可以用差分数组实现,每次修改的时间复杂度为O(1),查询的时间复杂度为O(n)。
2.若从第一个订单到第m个订单向上枚举,每次都利用差分数组算一遍每天的订单数,时间为O(m*n);但从题目中“输出第一个不能满足的订单编号”可以得到启示:二分答案。
时间复杂度就成了O(nlogm)。
补充:
差分数组的原理:
差分数组与部分和数组相类似
部分和数组是用每个数据记录原数组中多个元素的和(前缀和 或 后缀和),利用两个数据的差求原数组中多个数据的和,以前缀和数组为例, sum[i]=data[1]+data[2]+data[3]+……+data[i]
sum[i]-sum[j-1]=(data[1]+data[2]+data[3]+……+data[i])-(data[1]+data[2]+data[3]+……+data[j-1])
=data[j]+data[j+1]+……+data[i]。
差分数组每个数据记录原数组中该元素与其上一个元素的差,即diff[i]=data[i]-data[i-1],显然:
data[i]=data[i-1]+diff[i]=data[i-2]+diff[i-1]+diff[i]=……
=diff[1]+diff[2]+diff[3]+……+diff[i]
我们可以这样描述:data数组是diff数组的前缀和数组
一个显而易见的性质:当diff[i]改变时,data[i~n]的值会有相同的改变,如diff[i]+=1,diff[j+1]-=1,就相当于区间[i,j]都加了1,这样便可以用O(1)的时间实现区间修改了。
贴代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int data[],l[],r[],d[],diff[],n,m,f,g;
bool isok(int x)
{
memset(diff,,sizeof(diff));
for(int i=;i<=x;i++) //订单 1~x
{
diff[l[i]]+=d[i]; //差分数组
diff[r[i]+]-=d[i];
}
int sum=;
for(int i=;i<=n;i++)
{
sum+=diff[i];
if(sum>data[i]) return ;
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&data[i]);
for(int i=;i<=m;i++)
scanf("%d%d%d",&d[i],&l[i],&r[i]);
if(isok(m))
{
printf("");
return ;
}
printf("-1\n");
f=;g=m;
while(f<g) //二分订单数
{
int mid=(f+g)/;
if(isok(mid)) f=mid+;
else g=mid;
}
printf("%d\n",f);
return ;
}
【洛谷P1083】[NOIP2012]借教室的更多相关文章
- 洛谷 1083 (NOIp2012) 借教室——标记永久化线段树 / 差分+二分
题目:https://www.luogu.org/problemnew/show/P1083 听说线段树不标记永久化会T一个点. 注意mn记录的是本层以下.带上标记的min! #include< ...
- 洛谷P1083 [NOIP2012提高组Day2T2]借教室
P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...
- 【NOIP2012】【CJOJ1093】【洛谷1083】借教室
我写的是不完美算法!!! 题面 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的 ...
- 【分块】【常数优化】【Orz faebdc】洛谷 P1083 NOIP2012提高组 借教室
分块90分. By AutSky_JadeK [重点在下面] #include<cstdio> #include<cmath> using namespace std; #de ...
- NOIP2012借教室[线段树|离线 差分 二分答案]
题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自 ...
- NC16564 [NOIP2012]借教室
NC16564 [NOIP2012]借教室 题目 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借 ...
- [NOIP2012] 提高组 洛谷P1083 借教室
题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...
- NOIP2012 洛谷P1083 借教室
传送门 题意:有一些学(xian)生(quan)要借教室.在n天内,第i天学校有ri个教室.有m份订单,每份订单有三个数值dj,sj,tj,分别表示这个订单从第sj天开始到第tj天结束(包括端点),每 ...
- 洛谷P1083 借教室
P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...
随机推荐
- MATLAB-R2015b-win64安装详细教程
1.首先下载以下文件 链接:https://pan.baidu.com/s/1eRAOKZw 密码:5nkj 2.双击R2015b_win64.iso打开(win8,win8.1,win10均可直接打 ...
- WPF 窗体在Alt+Tab中隐藏
问题: 近段时间由于项目上的需求,需要在WPF中使用COM组件,并且由于软件界面设计等等原因,需要将部分控件显示在COM组件之上,由于WindowsFormsHost的一些原因,导致继承在WPF中的W ...
- 深入理解JavaScript系列(37):设计模式之享元模式
介绍 享元模式(Flyweight),运行共享技术有效地支持大量细粒度的对象,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 享元模式可以避免大量非常相似类的开销,在程序设 ...
- Java Socket通信示例
Socket分为ServerSocket和Socket两大类: 其中ServerSocket用于服务器端,可以通过accept方法监听请求,监听到请求后返回Socket: Socket用户具体完成数据 ...
- 数据库mysql中编码自动生成
call PrGetRuleCodeNoDate('Table_Name'); call PrGetRuleCode('Table_Name');
- redis的有序集合(Sorted Sets)数据类型
和Sets相比,Sorted Sets增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如一个存储全班同学成绩的Sorted Sets,其集合value可以是同学的学号,而 ...
- input placeholder 在chrome 浏览器自动填充时,背景色覆盖原有背景图片问题。
user-block-name, .user-block-pwd { margin-bottom: 10%; text-align: center; position: relative; } .us ...
- Not able to find Java executable or version转载
转载地址:https://blog.csdn.net/qq_40902122/article/details/79437991 findstr' 不是内部或外部命令,也不是可运行的程序或批处理文件.N ...
- wxpyhon 对话框
Python内置了好多定义好了的对话框供我们使用,这里先介绍三个最常用的: 1 Message dialog 2 Text entry 3 Choosing from a list 当然python还 ...
- Eclipse集成Maven(手工安装Maven且手工集成到Eclipse)
1.操作环境 操作系统:win8 64位 IDE:Helios Eclipse 1.8 JDK:1.6 2.资源准备 2.1 maven安装包: apache-maven-3.2.5-bin.zip ...