藍橋杯之 連號區間數(巧妙遍歷)

Description

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

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

若是區間[L, R] 裏的全部元素(即此排列的第L個到第R個元素)遞增排序後能獲得一個長度爲R-L+1的「連續」數列,則稱這個區間連號區間。

當N很小的時候,小明能夠很快地算出答案,可是當N變大的時候,問題就不是那麼簡單了,如今小明須要你的幫助。

Input

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

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

Output

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

Sample Input

樣例輸入1
4
3 2 4 1

樣例輸入2
5
3 4 2 5 1

Sample Output

樣例輸出1
7

樣例輸出2
9

Source

藍橋杯
 
 
分析:
兩種方法,一種是直接暴力,對每種可能都sort一下,看看是否符合要求,可是這種方法會超時。。。
第二種方法能夠叫作巧妙的遍歷
 
對每種可能,找到最大值和最小值,若是最大值減去最小值等於間距-1,那麼該可能就是符合要求的!
code:
#include<bits/stdc++.h>
using namespace std; int main() { int n; cin>>n; int a[n+1]; for(int i=1;i<=n;i++) cin>>a[i]; int sum=0; for(int i=1;i<=n;i++) { int maxx=0,minx=n+1; for(int j=i;j<=n;j++) { int x=a[j]; minx=min(minx,x); maxx=max(maxx,x); if(maxx-minx==j-i||maxx==minx) sum++; } } cout<<sum<<endl; return 0; }
相關文章
相關標籤/搜索