差分数组及应用

差分数组是啥?

我也不是很清楚,大概就是一个数组吧!

b战上有很多讲解的视频,我写下我学到的。

差分数组就是,原本有个数组,然后你要修改某个区间的数值,

正常人会想到遍历去修改,这是没错的,但吃力不讨好。

用差分数组可以很快搞定。

例如:

有一个全为0的数组a,把区间【2,5】上的值修改为1,只需要让a[2]=1,a[6]=-1,

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a[10]={0};
    //构造差分数组
	a[2]=1;
	a[6]=-1;
	int ans=0;
	for(int i=0;i<10;i++)
	{
		ans+=a[i];//修改后的数组第i项等于差分数组前i项的和
		cout<<ans<<" ";
	}
}

例题:

问题 I: Ensemble’s heritage

题目描述

作为十三课的卢卡,是没有权力去直接审讯犯人的。所以卢卡就偷到了N张卡,监狱一共有M个房间。

第i个监狱的门可以由 第L---R张卡打开

但是卢卡的数学并不好,他想让你帮帮他,有几张卡能打开所有的门

输入

N M
L1 R1
L2 R2
L3 R3
...

 
 

输出

要输出的

样例输入 复制

4 2
1 3
2 4
​

样例输出 复制

2

提示

1<=N<=1e5
1<=M<=1e5
1<=Li<=Ri<=N

#include<bits/stdc++.h>
using namespace std;
int s[101010];
int main()
{
int n,m;
cin>>n>>m;
//把能打开的位置加上1
for(int i=1;i<=m;i++)
{
int l,r;
cin>>l>>r;
s[l]++;
s[r+1]--;
}
int ans=0;
//如果该位置上有m个钥匙能打开,则结果加一
for(int i=1;i<=n;i++)
{
s[i]+=s[i-1];
if(s[i]==m)
ans++;
}
cout<<ans;
}

刚开始不会写,后来看了学长的,他用了差分数组,我心想差分数组是什么鬼??

然后上b战了,链接:

"差分"的介绍与使用方法_哔哩哔哩_bilibili

当然了,这里不用差分数组也可以写出来:我们用一个结构体来储存每个房间的左和右:

struct info{
    int l;
    int r;
}a[100005];

然后按照a[i].l 递增排序,再遍历这个结构体数组,找到最小的a[i].r,

再用最大的a[i].l减去这个最小的a[i].r就是答案辣(记得要加一)

#include<bits/stdc++.h>
#define int long long
using namespace std;

struct info{
	int l=0;
	int r=0;
}a[100005];

bool mysort(info a,info b)
{
	return a.l<b.l;
}

signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n,m;
	cin>>n>>m;
	for(int i=0;i<m;i++)
		cin>>a[i].l>>a[i].r;
	sort(a,a+m,mysort);
	int min=1000005;
	for(int i=0;i<m;i++)
	{
		if(a[i].r<min)
			min=a[i].r;
	}
	int ans=min-a[m-1].l+1;
	if(ans<0)
		cout<<0<<endl;
	else
		cout<<ans<<endl;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嗯嗯你说的对

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值