题目描述
众所周知, 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) 。