#4860. 神

题目描述

众所周知, HN-001 是神一般的存在。

HN-001 给了你一个 nn 阶排列 {ai}\{a_i\} ,并向你提出了 qq 次询问。每次询问 HN-001 会给出四个参数 l1,r1,l2,r2(1l1r1<l2r2n)l_1,r_1,l_2,r_2(1 \le l1 \le r1 < l2 \le r2 \le n) ,且 r1l1=r2l2r_1 − l_1 = r_2 − l_2 。记 m=r1l1+1m = r_1 − l_1 + 1 ,你需要构造一个 mm 阶排列 {bj}\{b_j\} 并满足:j[1,m],aj+l11<abj+l21\forall j \in [1,m], a_{j+l_1-1}< a_{b_j+l_2-1}

HN-001 并不满足于让你构造出一个 {bj}\{b_j\} , Ta 想让你算一下满足条件的的 {bj}\{b_j\} 的数量。由于 HN-001 崇尚秩序, Ta 对“逆序对”这类事物不感兴趣,因此排列 {aj}\{a_j\} 中的逆序对数不会太多,具体来说,就是满足 1x<yn1 \le x < y \le nax>aya_x > a_y 的二元组 (x,y)(x,y) 的数量不会超过 10510^5

由于答案可能很大, HN-001 不想太为难你,于是 Ta 只要你输出答案对 109+710^9 + 7 取模的结果。

数据范围

对于 100% 的数据, 1T10,1n,q1051 \le T \le 10 , 1 \le \sum_{n}, \sum_{q} \le 10^5 ,排列 {ai}\{a_i\} 的逆序对数不超过 10510^5

题解

考虑暴力,把两段区间分别排序,设 cnticnt_i 表示后一段第 ii 个数比前一段大的数的个数,那答案就是 i=1n(cntii+1)\prod_{i=1}^n(cnt_i-i+1) 。这样是 O(nq)O(nq) 的。

kk 为逆序对数,那么 (mcnti)k\sum(m-cnt_i) \le k ,也就意味着 cnticnt_i 不同的个数是 O(k)O(\sqrt k) ,那我们就可以把 cnticnt_i 相同的数放在一起算,这个过程可以用主席树维护,因此效率为 O(qklogn)O(q\sqrt klogn)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章