差分数组(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;
}
相关推荐
CV爱数码35 分钟前
论文精读|Learned Primal-Dual:把原始–对偶算法展开成网络
图像处理·算法·计算机视觉·ct·重建·断层扫描
yuniko-n1 小时前
【算法】约瑟夫环问题
java·算法
syagain_zsx1 小时前
jsoncpp 使用指南:编译链接、Json::Value 取值与高频坑
c++·json·库·http格式
l1t1 小时前
测试DuckDB v2.1.0-alpha49002的bignum乘法
数据库·sql·算法·duckdb
Nil2081 小时前
LeetCode 283移动零
数据结构·算法·leetcode
CQU_JIAKE2 小时前
10.18【A】
算法
LMT流氓兔2 小时前
第五单元——第4课:给工具参数加校验
java·前端·算法·ai·langchain
布莱克6052 小时前
理解 = delete 与 = default:两种赋值语义的差异
c++
物联网软硬件开发-轨物科技3 小时前
【轨物方案】深度解读开关柜智能感知及一键顺控专家系统
大数据·运维·网络·人工智能·算法·机器人
小小、码农3 小时前
[特殊字符]【C++11】类的新功能全面解析:移动构造、移动赋值、default、delete、final 与 override
linux·开发语言·网络·c++