//开一个数组p,下标为题中p的可能取值,值为p取值对应的区间段数目
#include <iostream>
using namespace std;
const int N = 1e6;
int a[N];
int c[N];//p的差分数组
int add(int r,int l){
c[r]++;
c[l+1]--;
}//对差分数组操作,相当于给原数组a[r,l]位置的数值都加一
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
if(a[i-1]<a[i]){
add(a[i-1]+1,a[i]);//后一个数比前一个大,则p任意取(a[i-1]+1,a[i])的值时都会有一个非零段,加一记下来
}
}
int maxn = 0;
int sum = 0;
for(int p=0;p<1e4;p++){
sum +=c[p];//差分数组的前缀和 = 原数组的值
maxn = max(sum,maxn);//最大前缀和即原数组中的最大值
}
cout<<maxn;
}
数组a,b,c,d
b[i]=a[0]+a[1]+a[2]+···+a[i] 则b是a的前缀和数组
c[i]=a[i]-a[i-1] c是a的差分数组
d[i]=c[0]+c[1]+c[2]+···+c[i] d是c的前缀和数组,
d[i]=c[0]+a[1]-a[0]+a[2]-a[1]+…+a[i]-a[i-1] = a[i]
就是说a的差分数组的前缀和数组等于a数组
还有一点,对a数组[r,l]位置上同时加n,就相当于是给a的差分数组c[r]+n,c[l+1]-n
感觉在学数学…如果哪里不对求指正,感谢