核心:枚举、根据题意寻找性质进行优化
注意:题目中输入的序列是1~N的排列,意思说,1~N每个数字只出现一次,不重复出现。
此外,[l,r]区间指的是序列中的第l个元素到第r个元素,进行sort后是连续的递增的。可以理解为l和r是序列的下标。
因此,我们可以发现,排序后的区间中的最大值-最小值=r-l,当l==r,等式依然成立。
算法流程
- 枚举区间左端点,
初始化最大值和最小值 - 枚举区间右端点,
更新最大值和最小值,
如果最大值-最小值=r-l,则ans++
#include<iostream>
using namespace std;
const int N=1e4+10;
int a[N];
int n;
int main(){
cin>>n;
int ans=0;
for(int i=1; i<=n; i++) cin>>a[i];
for(int i=1; i<=n; i++){
int max1=0, min1=1e9;
for(int j=i; j<=n; j++){
max1=max(max1,a[j]);
min1=min(min1,a[j]);
if((max1-min1)==(j-i))
{
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}