Xiao Mingは最近、このような奇妙で興味深い質問について考えてい
ます。1からNまでの特定の順列には、連続する間隔がいくつあるのでしょうか。
ここで説明するシリアル間隔の定義は次のとおりです。
間隔[L、R]内のすべての要素(つまり、この配置のL番目からR番目の要素)を昇順で並べ替えると、R-L +1の長さが得られます。 「連続」シーケンスは、この間隔連続番号間隔と呼ばれます。
Nが非常に小さい場合、Xiao Mingは答えをすばやく計算できますが、Nが大きくなると、問題はそれほど単純ではありません。XiaoMingはあなたの助けを必要としています。
入力フォーマット
最初の行は正の整数Nで、配置のスケールを示します。
2行目はN個の異なる番号Piで、これらのN個の番号の特定の配置を表しています。
出力形式
整数を出力します。これは、異なる連続する間隔の数を表します。
データ範囲
1≤N≤10000,1≤Pi≤N
入力例1: *
4
3 2 4 1
出力例1:
7
入力例2:
5
これらの2つの単語の配置に注意を払うと、この質問のアイデアは解決されます。配置は、各番号が1回だけ表示されることを示しています。間隔の長さがわかっている場合、間隔の最大値の差のみが、連続した間隔であるかどうかを判断できます。
ACコード:
#include<stdio.h>
#include<algorithm>
using namespace std;
int n;
int a[10010];
int maxv,minv;//所枚举区间内最值
int ans=0;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=n;++i)//枚举左端点
{
maxv=-0x7f7f7f7f;minv=0x7f7f7f7f;
for(int j=i;j<=n;++j)//枚举右端点
{
maxv=max(maxv,a[j]);minv=min(minv,a[j]);
if(maxv-minv==j-i) ++ans;
}
}
printf("%d",ans);
return 0;
}