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 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...
随机推荐
- 洛谷 P3807 【模板】卢卡斯定理
P3807 [模板]卢卡斯定理 题目背景 这是一道模板题. 题目描述 给定n,m,p(1\le n,m,p\le 10^51≤n,m,p≤105) 求 C_{n+m}^{m}\ mod\ pCn+mm ...
- Eclipse luna 装不上 veloeclipse
今天在Eclipse中始终无法安装veloeclipse ,报错:Failed to prepare partial IU: [R]com.googlecode.veloeclipse.ui 2.0. ...
- ASP.NET Web Pages - 教程
ASP.NET Web Pages - 教程 ASP.NET 是一个使用 HTML.CSS.JavaScript 和服务器脚本创建网页和网站的开发框架. ASP.NET 支持三种不同的开发模式:Web ...
- ZOJ 3632 Watermelon Full of Water (线段树 区间更新 + dp)
题目大意: 让每天都能吃到西瓜. 最少须要花多少钱. 思路分析: dp[pos] 就表示 要让 前i天每天都有西瓜吃.最少须要花多少钱. 那么假设你买这个西瓜的话. 那么这个西瓜能吃的持续时间都要更 ...
- asp.net mvc 抓取京东商城分类
555 asp.net mvc 抓取京东商城分类 URL:http://www.jd.com/allSort.aspx 效果: //后台代码 public ActionResult Get ...
- Node 即学即用 笔记 思维导图
Node即学即用 REPL(Read-Evaluate-Print-Loop) console.log .clear .help .exit require('http') ...
- Linux下通过find命令进行rm文件删除的小技巧
我们常常会通过find命令进行批量操作.如:批量删除旧文件.批量改动.基于时间的文件统计.基于文件大小的文件统计等.在这些操作其中,因为rm删除操作会导致文件夹结构变化,假设要通过find结合r ...
- AWK教程
1. IBM:GAWK入门:AWK语言基础 2. Unix AWK使用手册 3. 台湾中研院计算中心ASPAC计划之AWK程序介绍 4. Study-area之AWK 5. AWK学习笔记——酷勤 持 ...
- 使用OnScrollListener回调处理自己主动载入很多其它
首先来分析下OnScrollListener的回调. new OnScrollListener() { boolean isLastRow = false; @Override public void ...
- Vue常用语法及命令
1,Vue常用语法 vue常用语法之变量的定义 // 1,变量相关 // 变量的提升 var username = "雪雪"; var username ; console.log ...