差分数组(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;
}
相关推荐
程序员老舅2 小时前
C++高并发精髓:无锁队列深度解析
linux·c++·内存管理·c/c++·原子操作·无锁队列
划破黑暗的第一缕曙光2 小时前
[C++]:2.类和对象(上)
c++·类和对象
季明洵2 小时前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
shandianchengzi2 小时前
【小白向】错位排列|图文解释公考常见题目错位排列的递推式Dn=(n-1)(Dn-2+Dn-1)推导方式
笔记·算法·公考·递推·排列·考公
I_LPL2 小时前
day26 代码随想录算法训练营 回溯专题5
算法·回溯·hot100·求职面试·n皇后·解数独
Yeats_Liao3 小时前
评估体系构建:基于自动化指标与人工打分的双重验证
运维·人工智能·深度学习·算法·机器学习·自动化
墨雪不会编程3 小时前
C++之【深入理解Vector】三部曲最终章
开发语言·c++
cpp_25013 小时前
P9586 「MXOI Round 2」游戏
数据结构·c++·算法·题解·洛谷
浅念-3 小时前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
kyle~3 小时前
ROS2---QoS策略
c++·机器人·ros2