等差數列小應用

這個題用到了等差數列的小性質:an - am = n - m

一個區間內,最大值減最小值等於區間長度減一,這就是一個隨機序的等差數列

試題 歷屆試題 連號區間數

提交此題  

資源限制

時間限制:1.0s   內存限制:256.0MB

問題描述

小明這些天一直在思考這樣一個奇怪而有趣的問題:

在1~N的某個全排列中有多少個連號區間呢?這裏所說的連號區間的定義是:

如果區間[L, R] 裏的所有元素(即此排列的第L個到第R個元素)遞增排序後能得到一個長度爲R-L+1的“連續”數列,則稱這個區間連號區間。

當N很小的時候,小明可以很快地算出答案,但是當N變大的時候,問題就不是那麼簡單了,現在小明需要你的幫助。

輸入格式

第一行是一個正整數N (1 <= N <= 50000), 表示全排列的規模。

第二行是N個不同的數字Pi(1 <= Pi <= N), 表示這N個數字的某一全排列。

輸出格式

輸出一個整數,表示不同連號區間的數目。

樣例輸入1

4
3 2 4 1

樣例輸出1

7

樣例輸入2

5
3 4 2 5 1

樣例輸出2

9

#include<cstdio>
#include<iostream>
using namespace std;
#define MAXN 50015
int n,a[MAXN],ans,x;
int main()
{
    cin>>n;
    for(int i = 0; i < n; i++)
    {
        scanf("%d",&x);
        a[i] = x;
    }
    ans = n;
    int minn,maxx;
    for(int i = 0; i < n; i++)
    {
        minn = a[i];
        maxx = a[i];
        for(int j = i+1; j < n; j++)
        {
            
            if(a[j] > maxx) maxx = a[j];
            if(a[j] < minn) minn = a[j];
            if(maxx - minn == j - i) ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章