凡人修c传(六)一维差分(acwing 2014 岛以及其的一系列问题)

题目链接:2014. 岛 - AcWing题库

更感谢@大菜狗 大佬的题解和对差分的补充:AcWing 2014. 岛深入剖析差分的本质探究差分解法的由来 - AcWing

打了寒假的每日一题之后,对于差分愈发觉得妙。对于二维差分本萌新还没有学习,所以这里讲述的是一维的差分。

差分的题一般会考察两类:

一:借助差分来求中间的区间

这种比较常见,也是差分经常的考法了,通过一加一减进行抵消,来对代码进行优化,减少了时间复杂度。

二:对于差分的本身的探究

虽然第一种比较常见,但题目往往考差分想要考察的就是不常见的第二种。通过一加一减的抵消,来算差分本身的数据,进而最后映射到整体数据上。

讲的很抽象,可以参考100. 增减序列 - AcWing题库

而岛这道题,正式两种的结合。

注意,因为数据较大,数组不好存,还要用map离散化来协助计算。

代码如下:

#include<stdio.h>
#include<iostream>
#include<set>
#include<math.h>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
ll b[500005];
ll a[500005]; 
map<ll,ll>hh;
int main(){
	int n;
	cin>>n;
	ll an=0;
	for(int i=1;i<=n;i++){
		cin>>b[i];
		an=max(an,b[i]);
	}
	for(int i=1;i<=n;i++){
		if(b[i]>b[i-1]){
			hh[b[i-1]]++;
			hh[b[i]]--;
		}
	}
	ll ans=0;
	ll bn=0;
	for(int i=0;i<=an;i++){
		bn+=hh[i];
		ans=max(ans,bn);
	}
	cout<<ans;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值