藍橋杯 連號區間數

2022-05-19 03:00:09 字數 2419 閱讀 4323

歷屆試題 連號區間數  

時間限制:1.0s   記憶體限制:256.0mb

錦囊1並查集。

錦囊2從左到右掃瞄陣列,將所有掃瞄到的數放到並查集中,將相鄰的數在集合中合併。對於每個合併的集合記錄下遞增可連的次數和遞減可連的次數以及數字出現的最早和最晚時刻。當新掃瞄的數過來時根據以上幾個值來合併區間並維護。

問題描述

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

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

如果區間[l, r] 裡的所有元素(即此排列的第l個到第r個元素)遞增排序後能得到乙個長度為r-l+1的「連續」數列,則稱這個區間連號區間。

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

輸入格式

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

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

輸出格式

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

樣例輸入1

43 2 4 1

樣例輸出1

7樣例輸入2

53 4 2 5 1

樣例輸出29思路

連續的數列有什麼特徵呢,比如2,3,4,5,6。

開始是2,結尾是6,長度是5,即a[j]-a[i]+1=length。

區間[l,r]如果可以排成連續數列 ,那麼[

l,r]上的最大值和最小值正好是連續數列的兩個端點。

從而滿足上面關於長度的關係,即r-l+1=max-min+1。(區間長度等於元素相減的差)

於是將問題轉變為列舉區間,查詢區間最大值最小值。

實現直接想到rmq實現。

稍微玩點花樣。

**

1

//兩遍rmq寫法

2 #include3

using

namespace

std;

4const

int n = 50000 + 10;5

int n, a[n], ma[n], mi[n], d1[n][16], d2[n][16];6

7void

rmq_init1()

1314

void

rmq_init2()

2021

int query1(int l, int

r)26

27int query2(int l, int

r)32

33int

main()46}

47 printf("

%d", ans+n);

48return0;

49 }

1

//rmq的非模版結構體寫法,傳入stl的max和min法2//

注意用到了typedef簡化了max和min的定義3//

template< class t > 4//

const t& max( const t& a, const t& b );

5 #include6

using

namespace

std;

7const

int n = 50000 + 10;8

intn, a[n];910

struct

rmq20

21 ~rmq()

2425

void

rmq_init()

3132

int query(int l, int

r)37

};38

39int

main()50}

51 printf("

%d", ans+n);

52return0;

53 }

1

//rmq的模版結構體寫法,傳入stl的max和min法2//

陣列a也應該單獨用模版寫,不過不能放在全域性部分

3 #include4

using

namespace

std;

5const

int n = 50000 + 10;6

intn, a[n];

7 template

8struct

rmq18

19 ~rmq()

2223

void

rmq_init()

2930

int query(int l, int

r)35

};36

37int

main()48}

49 printf("

%d", ans+n);

50return0;

51 }

藍橋杯 連號區間數

問題描述 小明這些天一直在思考這樣乙個奇怪而有趣的問題 在1 n的某個全排列中有多少個連號區間呢?這裡所說的連號區間的定義是 如果區間 l,r 裡的所有元素 即此排列的第l個到第r個元素 遞增排序後能得到乙個長度為r l 1的 連續 數列,則稱這個區間連號區間。當n很小的時候,小明可以很快地算出答案...

藍橋杯 連號區間數

問題描述 小明這些天一直在思考這樣乙個奇怪而有趣的問題 在1 n的某個全排列中有多少個連號區間呢?這裡所說的連號區間的定義是 如果區間 l,r 裡的所有元素 即此排列的第l個到第r個元素 遞增排序後能得到乙個長度為r l 1的 連續 數列,則稱這個區間連號區間。當n很小的時候,小明可以很快地算出答案...

藍橋杯 連號區間數

峰值記憶體消耗 64m cpu消耗 5000ms 小明這些天一直在思考這樣乙個奇怪而有趣的問題 在1 n的某個全排列中有多少個連號區間呢?這裡所說的連號區間的定義是 如果區間 l,r 裡的所有元素 即此排列的第l個到第r個元素 遞增排序後能得到乙個長度為r l 1的 連續 數列,則稱這個區間連號區間...