1. 程式人生 > >藍橋杯 歷屆試題 7.連號區間數

藍橋杯 歷屆試題 7.連號區間數

/*問題描述
小明這些天一直在思考這樣一個奇怪而有趣的問題:
在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*/

思路:差點被其錦囊忽悠了。。按照並查集的思路去找的話 如何處理樹的建立及與並查集的轉換是一個比較難處理的問題

但是根據題目中給出的條件:遞增排序後能得到一個長度為R-L+1的“連續”數列

 因此判斷條件只需考慮為:陣列中從位置i開始到位置j的連續數列中,最大值-最小值=區間長度(即 j-i),即滿足條件計數器++(一開始,每個元素視為一個滿足條件的連續數列

import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int [] a=new int [n];
for(int i=0;i<n;i++){
a[i]=scan.nextInt();
}
scan.close();
int count=0;
for(int i=0;i<n;i++){
int max=a[i],min=a[i];
for(int j=i;j<n;j++){
if(a[j]>max){
max=a[j];
}else if(a[j]<min){
min=a[j];
}
if(max-min==j-i){
count++;
}
}
}
System.out.println(count);
}
}