当前位置: 首页 > 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;
}

http://www.dtcms.com/a/73507.html

相关文章:

  • 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驱动学习笔记(二)
  • 工作记录 2017-01-25
  • FlinkCDC 达梦数据库实时同步详解
  • 酵母生产二氢槲皮素-文献精读117
  • C++基础系列【24】STL迭代器和算法
  • 基于金融产品深度学习推荐算法详解【附源码】
  • 计算机视觉常见的算法
  • JSON数据格式介绍
  • 蓝耘智算|从静态到动态:探索Maas平台海螺AI图片生成视频功能的强大能力
  • 移动端开发基础与常见布局
  • 网络安全一CTF入门