首页 > 其他分享 >洛谷P1083 [NOIP2012 提高组] 借教室 && 差分学习笔记

洛谷P1083 [NOIP2012 提高组] 借教室 && 差分学习笔记

时间:2024-08-18 19:16:11浏览次数:14  
标签:二分 租借 洛谷 NOIP2012 int cf 差分 maxn P1083

传送门:P1083 [NOIP2012 提高组] 借教室

"八骏日行三万里,穆王何事不重来。"
可惜啊,他再也没有回来……

题目大意:

给你每天能够租借的教室数量 和 几份租借申请
每份申请包含 租界时间(从第几天到第几天)和 每天需要租借的教室数量
问你能否满足所有的租借要求,如果不能,驳回一份最前的不能满足要求的申请

思路:

  • 暴力:首先,这道题目的暴力很好想,就是从 1 开始遍历每一种订单,判断是否合法
    复杂度:O(nm),铁定爆炸

  • 线段树:蒟蒻第一眼看到这道题首先想到的是线段树,维护一个区间最小值,判断能否租借
    每次有租借请求就做一个区间减法
    但是一个黄题的话就有点。。。杀鸡焉用宰牛刀的感觉。其实是懒,而且要知道线段树复杂度还是很高的
    具体可以看一下这个大佬的博文

  • 至于正解:首先我们要明确一个知识点,那就是:

差分!

  • 引入:
    首先,给你一个问题:
    给出 n 个数,再给出 Q 个询问,每个询问给出 l, r ;
    要求你在 l 到 r 上每一个值都加上 x,而只给你 O(n) 的时间范围,怎么办?

  • 思路:
    还是用上面这个题目,假如要在 l 和 r 上全都加一个 x,很显然,这个 O(n) 是不可避免的。
    既然这样,那我们考虑在询问中我们不去来加,而是做一个标记,最后一起加上。 有一点线段树lazy_tag的思想

  • ps:以上摘自https://www.zybuluo.com/Junlier/note/1232395

  • 这就是差分
    差分即相邻两个数的差。
    我们可以这样去想:
    对于一个序列 a[ ]={1,3,4,7};
    我们构建一个差分数组 cf,cf[i] 表示 a[i] - a[i-1],则 cf[ ]={1,2,1,3};
    这时,对于求某个数,比如:

a[1] = cf[1];
a[2] = cf[1] + cf[2];
a[3] = cf[1] + cf[2] + cf[3];
a[4] = cf[1] + cf[2] + cf[3] + cf[4];``
  • 这时例如我们想要让 第 1 个数 和 第 3 个数 之间所有数 +3
    发现:cf[1]+=3,但是 1~3 的区间内的数的两两间的差值没有变,a[3] 与 a[4] 之间的差值(cf[4])-3,a[4] 与之后的数差值不变
    特殊 ——> 一般
    对于在 l 到 r 的区间内 +x,其实相当于 cf[l]+x,cf[r+1]-x。
    最后输出时,按照上面的方法顺序求解就好了。(区间减法亦然)

  • 顺便提一嘴,前缀和是用元数据求元与元之间的并集关系,而差分则是根据元与元之间的逻辑关系求元数据,是互逆思想。——摘自 皎月半洒花【小花】的题解

至此,我们就可以来探讨一下正解了 QWQ

那就是:差分 + 二分答案

  • 一般来说,二分是个很有用的优化途径,因为这样会直接导致减半运算,而对于能否二分,有一个界定标准:状态的决策过程或者序列是否满足单调性或者可以局部舍弃性。 而在这个题里,因为如果前一份订单都不满足,那么之后的所有订单都不用继续考虑;而如果后一份订单都满足,那么之前的所有订单一定都可以满足,符合局部舍弃性,所以可以二分订单数量。 ——摘自 皎月半洒花【小花】的题解

  • 二分查找の魔鬼细节,请移步

所以,每次二分一下,直到无法满足或者全枚举完结束。

代码:

不开 long long 见祖宗

#include<bits/stdc++.h>

using namespace std;

#define int long long

const int maxn=1001000;

int m,n;
int r[maxn];
int rr[maxn];
int d[maxn],s[maxn],t[maxn];
int cf[maxn];

bool check(int x)
{
	memset(cf,0,sizeof(cf));
	for(int i=1;i<=x;i++)
	{
		cf[s[i]]+=d[i];
		cf[t[i]+1]-=d[i];
	}
	for(int i=1;i<=n;i++)
	{
		rr[i]=rr[i-1]+cf[i];
		if(rr[i]>r[i])return 0;
	}
	return 1;
 } 

signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>r[i];
	for(int i=1;i<=m;i++)
		cin>>d[i]>>s[i]>>t[i]; 
	int left=1,right=m;
	while(left<right)
	{
		int mid=left+right>>1;
		if(check(mid))left=mid+1;
		else right=mid; //因为要查找的是右边界 
	}
	if(left<m)cout<<-1<<endl<<left<<endl;
	else cout<<0<<endl;
	return 0;
}

后记:

这是一篇写了两个半小时的博文。。。
写的时候确实是挺煎熬的
但我觉得这很有意义
学会了自己之前不会的知识,了解了新的思路,更重要的是能 +rp
另外,这确实是一道非常好的题目!

标签:二分,租借,洛谷,NOIP2012,int,cf,差分,maxn,P1083
From: https://www.cnblogs.com/lazy-ZJY0307/p/18365957

相关文章

  • 洛谷P1001题解
    洛谷P1001题解友情提示:“题目传送门”被贴在了题目编号上,请自行点击查看!主要知识点C/C++语言框架基本数据类型的定义与使用cin/cout或scanf()/prinf()的使用代码一小步,OI一大步(bushi)AC代码#include<bits/stdc++.h>typedeflonglongll; //“十年OI一场空,不开long......
  • 线段树模板,洛谷原题P3373
    线段树区间乘、加,范围求和,QWQ原题#include<bits/stdc++.h>#definePIIpair<int,int>#defineintlonglong#defineDBdoublenamespaceFastIO{ inlineintread(intMOD,int&ret){ charch=getchar();intngtv=1; if(MOD==0){while(ch<&#......
  • 洛谷P1536 村村通
    传送门:P1536村村通人间风起,四季同书。(还是一篇817的做题记录la~)题意:有好多组数据,每组数据给你m条无向边的信息(u,v);问你最少再添加多少条边就能使整张图连通。思路:首先我们要知道,一个图如果连通,边的数量最少是n-1;但是题目会出现这样一种情况:n=4,m=3;1<——>......
  • 洛谷 B3735 B3736 B3787 题解
    嘿嘿我发烧已经好了!题目目录:No.1 B3735[信息与未来2018]圣诞树No.2 B3736[信息与未来2018]最大公约数No.3 B3787[信息与未来2023]精密计时 OK,开始正文!第一题:B3735[信息与未来2018]圣诞树 题目描述圣诞树共有 nn 层,从上向下数第 11 层有 11 个......
  • 洛谷P5663 [CSP-J2019] 加工零件
    传送门:P5663[CSP-J2019]加工零件这是一篇写于2024.8.17的做题记录,祝稻米朋友们节日快乐。废话还是少说一点比较好qwq题目意思:(一个很抽象的东西)说白了其实就是给你一张无向图,然后有p次询问,每次询问给你一个v和L,问你从1号点到v号点有没有长度为L的边。注意......
  • 【题解】「NOIP2012」疫情控制
    https://www.luogu.com.cn/problem/P1084这道题难在贪心的思路,实现比较简单可以直接看代码。首先二分。现在转化为判定问题。可以用倍增求出每个军队最上面能到哪。结论1:我们一定不会把在除了根节点以外的军队往下移动。否则肯定不优。所以我们把能走到根节点的先存在一起......
  • 洛谷p1717题解
    题目描述话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999决定请他吃一次“年年大丰收”,为了表示诚意,他还决定亲自去钓鱼。但是,因为还要准备NOIP2013,z老师只给了他 H 个小时的空余时间,假设有 n 个鱼塘都在一条水平路边,从左......
  • 洛谷p2580题解
    题目背景XS中学化学竞赛组教练是一个酷爱炉石的人。他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900)。题目描述这之后校长任命你为特派探员,每天记录他的点名。校长会提供化学竞......
  • 洛谷——P1102 A-B 数对
    题目背景出题是一件痛苦的事情!相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的A+BProblem,改用A-B了哈哈!题目描述给出一串正整数数列以及一个正整数CCC,......
  • 洛谷——P1093 [NOIP2007 普及组] 奖学金
    题目背景NOIP2007普及组T1题目描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前555名学生发奖学金。期末,每个学生都有......