差分数组(c++)

干货

差分数组 ,顾名思义,就是记录差值的数组

这里举个例子:

上面一行是原数组,下面一行就是它所对应的差分数组

有些题目需要对原数组进行变动 ,当变动次数多时,可能会出现超时现象。

通过记录差值的方法,只需要变动一些差值,可以更高效地解决问题。

大家可能理解不了上面这段话。先不着急,不妨来做几道题,感受一下差分数组:

题目练习

航班预定统计

cpp 复制代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
int a[10010];
int d[10010];

int main()
{
	cin>>n>>m;
	while(m--)
	{
		int x,y,v;
		cin>>x>>y>>v;
		d[x] += v;
		d[y+1] -= v;
	}
	for(int i = 1;i<=n;i++)
	{
		a[i] = a[i-1]+d[i];
	}
	for(int i = 1;i<=n;i++)
	{
		cout<<a[i]<<" ";
	}
	
	return 0;
}

拼车

cpp 复制代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int c,t,n;
int a[10010];
int d[10010];

int main()
{
	cin>>c>>t;
	while(t--)
	{
		int x,y,v;
		cin>>v>>x>>y;
		d[x] += v;
		d[y+1] -= v;
		n = max(n,y);
	}
	bool f = true;
	for(int i = 1;i<n;i++)
	{
		a[i] = a[i-1]+d[i];
//		cout<<a[i]<<" ";
		if(a[i]>c)
		{
			f = false;
			break;
		}
	}
//	cout<<endl;
	if(f==true) cout<<"true";
	else cout<<"false";
	
	return 0;
}

会议室预订系统

cpp 复制代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,x,y;
int a[10010];
int d[10010];
int ma;

int main()
{
	cin>>n;
	for(int i = 1;i<=n;i++)
	{
		int x,y;
		cin>>x>>y;
		d[x]++;
		d[y+1]--;
	}
	for(int i = 1;i<=n;i++)
	{
		a[i] = a[i-1]+d[i];
		ma = max(ma,a[i]);
	}
	cout<<ma;
	
	return 0;
}
相关推荐
不正经学生44 分钟前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
毕竟是shy哥3 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲3 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
恋恋西风3 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
Brilliantwxx4 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
BizzZ_4 小时前
C++(22)——类型转换和IO流
开发语言·c++
晊晌_h5 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦5 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考5 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客6 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵