码迷,mamicode.com
首页 > 其他好文 > 详细

#4860. 神

时间:2020-06-06 22:02:05      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:$1   过程   一个   逆序对数   表示   strong   题目   题解   就是   

题目描述

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

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

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

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

数据范围

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

题解

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

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

#4860. 神

标签:$1   过程   一个   逆序对数   表示   strong   题目   题解   就是   

原文地址:https://www.cnblogs.com/xjqxjq/p/13056263.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!