C ++シリアル間隔番号(列挙)

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;
}

おすすめ

転載: blog.csdn.net/qq_44643644/article/details/108853166