Luogu P1083 借教室【二分答案/差分】By cellur925
在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要
向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。
面对海量租借教室的信息,我们自然希望编程解决这个问题。
我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借。共有m份
订单,每份订单用三个正整数描述,分别为dj, sj, tj,表示某租借者需要从第sj天到第tj天租
借教室(包括第sj天和第tj天),每天需要租借dj个教室。
我们假定,租借者对教室的大小、地点没有要求。即对于每份订单,我们只需要每天提
供dj个教室,而它们具体是哪些教室,每天是否是相同的教室则不用考虑。
借教室的原则是先到先得,也就是说我们要按照订单的先后顺序依次为每份订单分配教
室。如果在分配的过程中遇到一份订单无法完全满足,则需要停止教室的分配,通知当前申
请人修改订单。这里的无法满足指从第sj天到第tj天中有至少一天剩余的教室数量不足dj个。
现在我们需要知道,是否会有订单无法完全满足。如果有,需要通知哪一个申请人修改
订单。
第一行包含两个正整数n, m,表示天数和订单的数量。
第二行包含n个正整数,其中第i个数为ri,表示第i天可用于租借的教室数量。
接下来有m行,每行包含三个正整数dj, sj, tj,表示租借的数量,租借开始、结束分别在
第几天。
每行相邻的两个数之间均用一个空格隔开。天数与订单均用从1开始的整数编号。
如果所有订单均可满足,则输出只有一行,包含一个整数 0。否则(订单无法完全满足)
输出两行,第一行输出一个负整数-1,第二行输出需要修改订单的申请人编号。
4 3
2 5 4 3
2 1 3
3 2 4
4 2 4
-1
2
【输入输出样例说明】
第 1 份订单满足后, 4 天剩余的教室数分别为 0,3,2,30,3,2,30,3,2,3 。第 222 份订单要求第 22 2 天到第 444 天每天提供 3 3 3 个教室,而第 333 天剩余的教室数为 2 22 ,因此无法满足。分配停止,通知第 222 个申请人修改订单。
【数据范围】
对于10%的数据,有 1≤n,m≤10 ;
对于30%的数据,有 1≤n,m≤1000 ;
对于 70%的数据,有 1 ≤ n,m ≤ 10^5;
对于 100%的数据,有1 ≤ n,m ≤ 10^6,0 ≤ ri,dj≤ 10^9,1 ≤ sj≤ tj≤ n 。
NOIP 2012 提高组 第二天 第二题
本题的正解(之一)是二分。如何思考出的?这道题满足二分单调性。即如果我们能满足k个订单,那么我们一定能满足k-1及更少个数的订单。而k+1及更多的订单则不一定。由此我们也就知道了我们二分的是可满足的订单个数。如果最后l==m证明大家的需求都能满足,否则则不能满足。
同“逛画展”,二分的复杂度是logn,而本题的数据是1e6,那么我们要绞尽脑汁使check函数的复杂度为O(n)甚至更低。
check函数的原理其实就是在判断做mid个订单是否满足。这里我们用前mid个订单来代表判断。如果需求小于供给,则绝对满足。但是这就会用到区间查询稍不留神check函数的复杂度就会飙升至O(n²)。
区间维护的问题我们通常会想到用数据结构/前缀和、差分。本题用线段树貌似是大材小用。借此机会,我正学了一下差分QAQ。
通俗地讲,差分就是当我们要对区间进行区间修改(如加上一个数z)时,这个区间为[l,r],我们另开一个数组称为差分数组,在这个数组的l位置加上我们的z,在这个数组的r-1位置减上z,再对这个数组进行前缀和,就可以求出修改后的序列。
在本题中的check函数,我们求出在当前条件下的需求,一旦需求大于供给(各天教室个数),则显然不合法,返回0.
code
#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 1000100 using namespace std;
typedef long long ll; int n,m;
ll h[maxn],d[maxn],s[maxn],t[maxn],cop[maxn],need[maxn]; bool check(int x)
{
memset(h,,sizeof(h));
for(int i=;i<=x;i++)
h[s[i]]+=d[i],h[t[i]+]-=d[i];
for(int i=;i<=n;i++)
{
need[i]=need[i-]+h[i];
if(need[i]>cop[i]) return ;
}
return ;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%lld",&cop[i]);
for(int i=;i<=m;i++) scanf("%lld%lld%lld",&d[i],&s[i],&t[i]);
ll l=,r=m,mid=;
while(l<r)
{
mid=(l+r)>>;
if(check(mid)) l=mid+;
else r=mid;
}
if(l==m)
{
printf("0\n");
return ;
}
else printf("-1\n%lld",l);
return ;
}
Luogu P1083 借教室【二分答案/差分】By cellur925的更多相关文章
- luogu1083 [NOIp2012]借教室 (二分答案+差分)
先二分一个答案x,然后通过差分来看有没有不满足的 #include<bits/stdc++.h> #define pa pair<int,int> #define lowb(x ...
- luogu P1083 借教室 x
P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...
- LuoGu P1083 借教室
题目传送门 借教室这个题有两种做法,差分+前缀和或者是线段树 线段树维护区间最小值,因为能不能借教室使用是由这几天中可用教室最少的一天决定的 其实这题是个很裸的线段树维护区间最小值,但有一点需要注意, ...
- [NOIp2012] luogu P1083 借教室
该*的英语,这么长还要背. 题目描述 你有 nnn 个数 ai{a_i}ai,mmm 次操作,每次操作将 [l,r][l,r][l,r] 区间的每个数减去 ccc.要求任何时刻 ∀x∈[1,n]\f ...
- Luogu 1083 借教室(二分,差分)
Luogu 1083 借教室(二分,差分) Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不 ...
- [NOIP2012提高]借教室 题解(二分答案+差分)
[NOIP2012提高&洛谷P1083]借教室 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室 ...
- P1083 借教室(差分+二分)
P1083 借教室 第一眼:线段树. 然鹅懒得写. 正解:差分+二分. 显然订单合法的上线可以二分 然后差分数组维护一下.没了. #include<iostream> #include&l ...
- 洛谷P1083 借教室
P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...
- 洛谷 P1083 借教室 题解
P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...
随机推荐
- C. The Two Routes---cf602C(Dij)
http://codeforces.com/problemset/problem/602/C 题目大意: 有n个城市 有m条铁路 如果两个城市没有铁路 那么一定有公路 求从1 到 n 用铁路和公 ...
- google --SwitchyOmega and switchysharp ***
https://github.com/FelisCatus https://chrome.google.com/webstore/search/Proxy%20SwitchySharp%20?hl=z ...
- OpenWRT解决因PPPOE丢包导致频繁掉线问题
其关键在于这两个参数 lcp-echo-interval 1 #发送间隔秒 lcp-echo-failure 5 #5次未响应断开 因为OpenWRT默认的设置为1秒发送一次 5次没有响应就 ...
- 小心入怀Yaf
http://www.laruence.com/2015/05/14/3021.html, 鸟哥文章 看了这个文章,更加要小心的对待 Yaf Yar 框架了. 不正确 glib 有一定的了解进来就是深 ...
- CentOS 更改Apache默认网站目录
http://www.osyunwei.com/archives/789.html引言:Apache默认的网站目录是在/var/www/html, 现在要把网站目录更改到/home/wwwroot/w ...
- CentOS7 设置系统时间
在CentOS 6版本,时间设置有date.hwclock命令, 硬件时钟和系统时钟 (1) 硬件时钟 RTC(Real-Time Clock)或CMOS时钟,一般在主板上靠电池供电,服务器断电后也会 ...
- apache下配置认证用户
有时候我们须要给我apacheserver下制定的文件夹加上用户认证,方便一些而用户进行文件的浏览.配置例如以下: 1 设置用户 1 htpasswd -c file_path user_name 回 ...
- HDU 1176-免费馅饼(DP_逆推)
免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- createElement与innerHtml性能比較
js中.动态加入html的方法大致就是两种,一种是document.createElement等方法创建,然后使用Element.appendChild加入,或者是使用Element.innerHTM ...
- Linux下使用inotify实现对文件的监控
项目中,要实现用户通过网页设置參数,后台接收数据然后写串口. 网页写数据到本地文件,使用inotify监控文件的IN_MODIFY事件.当文件被改动,然后触发写串口事件. 第一个程序只把要监控的文件增 ...