题目链接: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;
}