題目描述
衆所周知, HN-001 是神一般的存在。
HN-001 給了你一個 n 階排列 {ai} ,並向你提出了 q 次詢問。每次詢問 HN-001 會給出四個參數 l1,r1,l2,r2(1≤l1≤r1<l2≤r2≤n) ,且 r1−l1=r2−l2 。記 m=r1−l1+1 ,你需要構造一個 m 階排列 {bj} 並滿足:∀j∈[1,m],aj+l1−1<abj+l2−1 。
HN-001 並不滿足於讓你構造出一個 {bj} , Ta 想讓你算一下滿足條件的的 {bj} 的數量。由於 HN-001 崇尚秩序, Ta 對“逆序對”這類事物不感興趣,因此排列 {aj} 中的逆序對數不會太多,具體來說,就是滿足 1≤x<y≤n 且 ax>ay 的二元組 (x,y) 的數量不會超過 105 。
由於答案可能很大, HN-001 不想太爲難你,於是 Ta 只要你輸出答案對 109+7 取模的結果。
數據範圍
對於 100% 的數據, 1≤T≤10,1≤∑n,∑q≤105 ,排列 {ai} 的逆序對數不超過 105 。
題解
考慮暴力,把兩段區間分別排序,設 cnti 表示後一段第 i 個數比前一段大的數的個數,那答案就是 ∏i=1n(cnti−i+1) 。這樣是 O(nq) 的。
設 k 爲逆序對數,那麼 ∑(m−cnti)≤k ,也就意味着 cnti 不同的個數是 O(k) ,那我們就可以把 cnti 相同的數放在一起算,這個過程可以用主席樹維護,因此效率爲 O(qklogn) 。