題目描述:
小明這些天一直在思考這樣乙個奇怪而有趣的問題:
在1~n的某個全排列中有多少個連號區間呢?這裡所說的連號區間的定義是:
如果區間[l, r] 裡的所有元素(即此排列的第l個到第r個元素)遞增排序後能得到乙個長度為r-l+1的「連續」數列,則稱這個區間連號區間。
當n很小的時候,小明可以很快地算出答案,但是當n變大的時候,問題就不是那麼簡單了,現在小明需要你的幫助。
輸入格式:
第一行是乙個正整數n (1 <= n <= 50000), 表示全排列的規模。
第二行是n個不同的數字pi(1 <= pi <= n), 表示這n個數字的某一全排列。
輸出格式:
輸出乙個整數,表示不同連號區間的數目。
示例:使用者輸入:
43 2 4 1
程式應輸出:
7使用者輸入:
53 4 2 5 1
程式應輸出:
9解釋:
第乙個用例中,有7個連號區間分別是:[1,1], [1,2], [1,3], [1,4], [2,2], [3,3], [4,4]
第二個用例中,有9個連號區間分別是:[1,1], [1,2], [1,3], [1,4], [1,5], [2,2], [3,3], [4,4], [5,5]
資源約定:
峰值記憶體消耗 < 64m
cpu消耗 < 5000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。
所有**放在同乙個原始檔中,除錯通過後,拷貝提交該原始碼。
注意: main函式需要返回0
注意: 只使用ansi c/ansi c++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。
注意: 所有依賴的函式必須明確地在原始檔中 #include , 不能通過工程設定而省略常用標頭檔案。
提交時,注意選擇所期望的編譯器型別。
題目思路:
題目例子中給出的區間是第1個數到第1個數,第1個數到第2個數,第1個數到第3個數.....
最直接的一種想法是,列舉所有的區間,將所有區間進行排序,看是否區間是連續的。如果區間是連續的那麼最大的數max和最小的數min,區間的數字個數n,應該滿足關係max-min+1 = n ;這樣我們在列舉區間後,只要進行這樣的判斷就可以斷定該區間是否是連續
題目**:
#include#includeusing namespace std;
int a[50001];
int n,ans=0;
int main()
} printf("%d\n",ans);
return 0;
}
藍橋杯 第四屆藍橋杯省賽C B組 連號區間數
小明這些天一直在思考這樣乙個奇怪而有趣的問題 在 1 n的某個排列中有多少個連號區間呢?這裡所說的連號區間的定義是 如果區間 l,r 裡的所有元素 即此排列的第 l 個到第 r 個元素 遞增排序後能得到乙個長度為 r l 1 的 連續 數列,則稱這個區間連號區間。當 n 很小的時候,小明可以很快地算...
第四屆藍橋杯真題 連號區間
本來想練習並查集,然後在看官網提示這是並查集型別題目,上來先默寫了一下並查集,想了半天並查集怎麼寫。我呸,並查集。這裡找規律。區間的 最大值 最小值 區間長度 直接列舉。討厭這種找規律的題。include include include include using namespace std con...
第四屆藍橋杯省賽C B組 字首判斷
如下的 判斷 needle start指向的串是否為haystack start指向的串的字首,如不是,則返回null。比如 abcd1234 就包含了 abc 為字首 char prefix char haystack start,char needle start if needle retur...