传送门

题意:有一些学(xian)生(quan)要借教室。在n天内,第i天学校有ri个教室。有m份订单,每份订单有三个数值dj,sj,tj,分别表示这个订单从第sj天开始到第tj天结束(包括端点),每天需要dj个教室。

我们要按照订单的顺序一次处理每一个订单,如果有某个订单不能满足(当天的教室数量小于需求数),就需要输出-1和这个订单的序号,否则输出0


首先看到这个题,第一想到的当然是暴力了qwq。依次处理每一个订单,暴力从每一天的教室数量内减去需求数,如果某一天教室数量小于0,就输出这份订单的编号

时间复杂度O(mn)

代码:

#include<bits/stdc++.h>
using namespace std; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} struct ding
{
int d,s,t;
}dan[]; int n,m;
int r[]; int main()
{
n=read(),m=read();
for(int i=;i<=n;i++) r[i]=read();
for(int i=;i<=m;i++)
{
dan[i].d=read();
dan[i].s=read();
dan[i].t=read();
}
for(int i=;i<=m;i++)
{
for(int j=dan[i].s;j<=dan[i].t;j++)
{
r[j]-=dan[i].d;
if(r[j]<)
{
printf("-1\n%d",i);
return ;
} }
}
printf("");
}

能拿45分。


开动你聪明的小脑袋想(tou)想(li),其实可以把每一个订单看成一个区间,那这个题不就是区间修改问题吗?于是我们很容易想到既好用又好写的线段树了。线段树操作方便,复杂度低,很适合做这道题

代码:

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<time.h>
#include<queue>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pr;
const double pi=acos(-);
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define Rep(i,u) for(int i=head[u];i;i=Next[i])
#define clr(a) memset(a,0,sizeof a)
#define pb push_back
#define mp make_pair
#define fi first
#define sc second
ld eps=1e-;
ll pp=;
ll mo(ll a,ll pp){if(a>= && a<pp)return a;a%=pp;if(a<)a+=pp;return a;}
ll powmod(ll a,ll b,ll pp){ll ans=;for(;b;b>>=,a=mo(a*a,pp))if(b&)ans=mo(ans*a,pp);return ans;}
ll read(){
ll ans=;
char last=' ',ch=getchar();
while(ch<'' || ch>'')last=ch,ch=getchar();
while(ch>='' && ch<='')ans=ans*+ch-'',ch=getchar();
if(last=='-')ans=-ans;
return ans;
}
//head 哈哈哈没有想到吧这篇题解不是线段树
线段树什么的根本不存在的QωQ

咳咳咳。。。下面转入正题

我们可以用差分数组鸭。

对于一次从s开始到t,需要d的操作,我们只需要把差分数组的第s项-d,第t+1项+d就可以了。值得一提的是,负数显然不太好,所以我们可以把负数转化成正数然后比较大小

把差分数组的第s项+d,第t+1项-d

然后,对于这个神奇的答案范围,显然直接搞事情是不行的,我们可以二分,然后检查是否满足条件就可以了。

上海世界外国语中学初三某C姓同学的题解(正解)

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 1000005 using namespace std; int LEFT,MID,RIGHT,n,m,r[maxn],d[maxn],s[maxn],t[maxn],day[maxn]; bool judge(int mid)
{
memset(day,,sizeof(day));
for (int i=;i<=mid;i++)
{
day[s[i]]+=d[i];
day[t[i]+]-=d[i];
}
if (day[]>r[])
return ;
for (int i=;i<=n;i++)
{
day[i]+=day[i-];
if (day[i]>r[i])
return ;
}
//cout << -1 << endl;
return ;
} int main()
{
//freopen("classroom.in","r",stdin);
//freopen("classroom.ans","w",stdout);
cin >> n >> m;
for (int i=;i<=n;i++)
scanf("%d",&r[i]);
for (int i=;i<=m;i++)
scanf("%d%d%d",&d[i],&s[i],&t[i]);
LEFT=;RIGHT=m;
while (LEFT<RIGHT)
{
MID=(LEFT+RIGHT)/;
//cout << LEFT << " " << RIGHT << " " << MID << endl;
if (judge(MID))
RIGHT=MID;
else LEFT=MID+;
}
if (m!=RIGHT)
{
cout << - << endl;
cout << RIGHT << endl;
}
else cout << << endl;
return ;
}

接下来是神(wai)奇(men)解(xie)法(dao)

这里我用了差分+前缀和的思想,把每一天需要的教室数量搞了出来,然后枚举每一天,直到发现供不应求的情况就滚回去一个个减,直到满足情况为止

代码:

#include<bits/stdc++.h>
using namespace std; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} typedef long long ll; struct ding
{
int d,s,t;
}dan[]; int n,m;
int r[];
int cf[],sum[];
int anss=; int main()
{
n=read(),m=read();
for(int i=;i<=n;i++)
{
r[i]=read();
}
for(int i=;i<=m;i++)
{
dan[i].d=read();
dan[i].s=read();
dan[i].t=read();
sum[dan[i].s]+=dan[i].d;
//这里用了比较大小的方法,因为据说负数容易re
sum[dan[i].t+]-=dan[i].d;
}
for(int i=;i<=n;i++)
{
sum[i]+=sum[i-];
}//计算每一天的教室需求量
for(int i=;i<=n;i++)
{
if(sum[i]>r[i])//枚举到需求量大于拥有量
{
ll ans=sum[i];
int j;
for(j=m;j>=;j--)
{
if(dan[j].s<=i&&dan[j].t>=i)
{
ans-=dan[j].d;
//暴力一个个减回去直到符合条件
if(ans<=r[i]) break;
}
}
anss=min(anss,j);//取最前面的
if(anss==) break;
} }
if(anss==) printf("");
else printf("-1\n%d",anss);
return ;
//最坏复杂度为O(mn)
}

理论上最坏复杂度是O(mn)的。。。但是实际跑起来还贼快,一定是随机数据的锅qwq

NOIP2012 洛谷P1083 借教室的更多相关文章

  1. 洛谷P1083 借教室

    P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...

  2. 【题解】洛谷 P1083 借教室

    目录 题目 思路 \(Code\) 题目 P1083 借教室 思路 线段树.需要的操作为区间修改,区间查询.维护每个区间的最小值就好. \(Code\) #include<iostream> ...

  3. 洛谷 P1083 借教室 题解

    P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...

  4. [NOIP2012] 提高组 洛谷P1083 借教室

    题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...

  5. VIjos——V 1782 借教室 | | 洛谷——P1083 借教室

    https://vijos.org/p/1782|| https://www.luogu.org/problem/show?pid=1083 描述 在大学期间,经常需要租借教室.大到院系举办活动,小到 ...

  6. 洛谷P1083 借教室 题解

    题目 [NOIP2012 提高组] 借教室 题解 这道题是几周之前做到的一道题,本来不想讲的,因为这道题也是用到了二分答案的方法,这类题目之前已经发布过两篇题解了.但这道题还运用了差分数组这个思想,所 ...

  7. 洛谷P1083借教室题解

    题目 这个难度感觉并没有那么高,因为这个题暴力也好打,但是比较难想出正解,因为如果你不看标签是很难想到这个题竟然是二分,当然前缀和应该很好想,毕竟让你求的是在某段时间内借教室的和是否满足. 这样我们可 ...

  8. 洛谷 P1083 借教室【二分+差分/线段树】

    二分mid,然后用1~mid的操作在差分序列上加减,最后把差分序列前缀和起来,看是否有有超过初始r值的 #include<iostream> #include<cstdio> ...

  9. 『题解』洛谷P1083 借教室

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 在大学期间,经常需要租借教室.大到院系举办活动,小到 ...

随机推荐

  1. NOIP赛前集训备忘录(含每日总结)(日更?。。。)

    NOIP赛前集训备忘录(含每日考试总结) 标签: 有用的东西~(≧▽≦)/~啦啦啦 阅读体验:https://zybuluo.com/Junlier/note/1279194 考试每日总结(这个东西是 ...

  2. redis学习之旅-初识Redis

    定义: redis是一种支持Key-Value等多种数据结构的存储系统.可用于缓存,事件发布或订阅,高速队列等场景.该数据库使用ANSI C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直 ...

  3. 说说 HeapSort 堆排序思想,以及个人优化方案。(老物)

    听说你要排上亿个数据之 HeapSort ? 前言 : 来来来,今天我们来说说一个用来排大量数据所用的基础比较排序吧~ 注:阅读本文学习新技能的前置要求为:了解什么是二叉树及其数组性质,如果未达到要求 ...

  4. vue(js)点击目标div以外区域将目标div隐藏

    今天开发新项目的时候,有个需求,点击一个div 展示出个弹出窗 弹出窗标题的颜色要跟点击的div图标颜色一致, 所以这就需要我遍历一下多个数据, 然后需要点击弹出div的外部其他区域,隐藏这个div. ...

  5. 猿题库 iOS 客户端架构设计(原文地址:http://gracelancy.com/blog/2016/01/06/ape-ios-arch-design/)

    猿题库 iOS 客户端架构设计 序 猿题库是一个拥有数千万用户的创业公司,从2013年题库项目起步到2015年,团队保持了极高的生产效率,使我们的产品完成了五个大版本和数十个小版本的高速迭代.在如此快 ...

  6. verilog版插值

      开发环境:IDE:LIBERO 9.0(ACTEL公司的)芯片:AFS600 (BGA256),是混合系列的FPGA仿真软件:modelsim atcel 6.5d综合软件:synplify pr ...

  7. Educational Codeforces Round 55 (Rated for Div. 2) B. Vova and Trophies (贪心+字符串)

    B. Vova and Trophies time limit per test2 seconds memory limit per test256 megabytes inputstandard i ...

  8. php.ini中时区设置不成功解决方法

    一.在php.ini的[Date]中加入 [Date] date_default_timezone_set('UTC'); date.timezone = "Asia/Shanghai&qu ...

  9. 转 Java中final、finally、finalize的区别与用法

    Java中final.finally.finalize的区别与用法   1.简单区别:final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承.finally是异常处理语句结构 ...

  10. Java动手动脑02

    一.平方数静方法: public class SquareInt { public static void main(String[] args) { int result; for (int x = ...