当前位置: 首页 > news >正文

蓝桥杯备考-----》差分数组+二分答案 借教室

这道题我们第一个想法就是差分数组,但是差分数组的话我们每进行完一次操作都要还原一下数组看看有没有违规的值,时间复杂度就是n平方了,那就和暴力没啥区别了呀》

第二个想法一定是线段树,but 杀鸡焉用牛刀

我们可以用二分答案配合差分数组

什么意思呢?

我们的订单编号是有个二段性的

这时候我们的时间复杂度就是logM*N了,

#include <iostream>
using namespace std;
int n,m;//n表示一共几天 m表示几个订单 
const int N = 1e6+10;
int a[N];//第i天的教室剩余量
int d[N],s[N],t[N];
int f[N];
typedef long long ll;
bool check(int x)
{
	for(int i = 1;i<=n;i++)//构建差分数组 
	{
		f[i] = a[i]-a[i-1];
	}
	for(int i = 1;i<=x;i++)
	{
		f[s[i]]-=d[i];
		f[t[i]+1]+=d[i];
	}
	for(int i = 1;i<=n;i++)
	{
		f[i] = f[i-1]+f[i];
		if(f[i] < 0) return false;
	}
	return true;
}
int main()
{
	cin >> n >> m;
	for(int i = 1;i<=n;i++)
	{
		cin >> a[i];
	}
	for(int i = 1;i<=m;i++)
	{
		cin >> d[i] >> s[i] >> t[i];
	}
	//我们需要找到第一个订单错误的编号,
	//如果我们用差分数组的话,每次区间加完之后还要还原一下原数组,时间复杂度是O(N平方)
	// 最好的解决办法就是线段树,but 杀鸡焉用牛刀?
	//我们可以用二分答案+差分数组来做。
	ll l = 1,r=m;
	
	while(l<r)
	{
		ll mid = (l+r)/2;
		if(check(mid)) l = mid+1;
		else r = mid;
	}
	if(check(l)) cout << 0 << endl;
	else {
		cout << -1 << endl;
		cout << l << endl;
	}
	
	
	
	
	return 0;
}

相关文章:

  • deepseek连续对话与API调用机制
  • axios防止重复请求
  • DJ串烧集 2.4.5 | 海量大型DJ串烧歌曲,无广告,无需登录,高清在线播放
  • Apache Shiro 使用教程
  • Redis,从数据结构到集群的知识总结
  • OpenGL ES 入门指南:从基础到实战
  • 【JavaEE】Spring Boot 日志
  • 基于VMware的虚拟机集群搭建
  • 机器学习之浅层神经网络
  • Matlab 舰载机自动着舰控制系统研究
  • 咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包
  • Markdown 模板变量的使用
  • 科研入门--SCI及分区
  • Linux:UDP和TCP报头管理
  • C++ STL map
  • 模板字面量标签函数
  • pyqt 上传文件或者文件夹打包压缩文件并添加密码并将密码和目标文件信息保存在json文件
  • ccf3401矩阵重塑(其一)
  • 使用Ajax技术进行动态网页的爬虫(pycharm)
  • Linux驱动学习笔记(二)
  • 新时代,新方志:2025上海地方志论坛暨理论研讨会举办
  • 外企聊营商|上海仲裁:化解跨国企业纠纷的“上海路径”
  • 篮球培训机构东方启明星被指停摆,家长称已登记未退费用超百万
  • 《五行令》《攻守占》,2个月后国博见
  • 世界数字教育大会发布“数字教育研究全球十大热点”
  • 上海国际珠宝时尚功能区未来三年如何建设?六大行动将开展