#P593. 好看的pancake

    ID: 593 Type: Default 1000ms 256MiB Tried: 0 Accepted: 0 Difficulty: (None) Uploaded By: Tags>競賽題目DPDP優化Fenwick TreeSegment Tree

好看的pancake

題目描述

某個廚師十分喜歡炮製pancake。每個pancake都是圓的,所以我們總可以用直徑來表示其大小。這一次,廚師依次製作了 n 個不同大小的pancake,並把它們一字排開在枱上。

廚師先拿出一個空碟子,再由左到右考慮這 n 個pancake:對每一個pancake他可以選擇把它疊到碟子上,也可以選擇暫時放棄這個pancake;如此考慮完 n 次後,碟子上便會有若干個pancake。如果這 n 個pancake是由下至上越來越小的話,廚師就會說疊起來的那堆pancake是「好看」的,因為由上至下看時我們剛好能清晰看見每一件pancake (沒有pancake被上面的遮蓋)。換句話說,廚師希望選出來的每個pancake都比上一個選出的小。例如當pancake直徑依次為 (6, 5, 2, 3) 時,(3), (2), (5), (6), (6, 3), (6, 2), (6, 5), (5, 2), (5, 3), (6, 5, 2), (6, 5, 3) 是所有合法的堆疊方法。注意每種方法都至少要疊上一個pancake。

此時廚師突發奇想,到底共有多少種方法可以疊出好看的pancake呢?無奈他覺得這個問題極難,所以選擇把重任交給你。由於總方法數可能很大,請輸出答案除以 109+7 (一個質數) 的餘數。

(或者,一個較無趣的題目表達是: 給定一有 n 個互異正整數的序列,求其單調下降子序列的數目。)

輸入格式

第一行有一正整數 T (1 <= T <= 5),表示接下來有 T 組獨立的測資。(需要應答 T 次)

每個測資共有兩行。第一行給定一個正整數 n ,表示pancake數目;第二行則給 n 個正整數 (以空格隔開),其中第 i 個數為第 i 個做出的pancake的直徑 di。保證 di 兩兩不同。

1 <= n <= 105, 1 <= di <= 109

輸出格式

共輸出 T 行,分別為 T 個測資的答案。對第 i 個測資輸出有多少種方法 (mod 109+7) 可以使抽出來的pancake是好看的。

Samples

["4\r\n3\r\n3 2 1\r\n4\r\n1 2 4 3\r\n4\r\n2 3 1 4\r\n3\r\n2 1 3","5\r\n4\r\n6 5 2 3\r\n5\r\n9 7 5 4 2\r\n6\r\n1 2 3 4 7 9\r\n1\r\n9\r\n5\r\n4 3 1 2 5"]
["7\r\n5\r\n6\r\n4","11\r\n31\r\n6\r\n1\r\n12"]

提示

温馨提示:系統能根據完成程度給予部分分數,但若要完全解決這題需要能處理 n, di 較大的情況。

原始資料

  • Zero1 題號:a593
  • Hydro 題號:Z0593
  • Locale:zh_TW
  • Display:open