首页 > 其他分享 >随机逆序对 题解

随机逆序对 题解

时间:2024-03-11 15:22:17浏览次数:22  
标签:limits 题解 sum pos 枚举 随机 序列 逆序

题意

给定 $1\sim n$ 的排列 $a_{1...n}$ 。在上面进行依次如下操作:

  1. 首先在$[1,n]$​中选取一个子序列(可以为空);

  2. 然后将这个子序列内的数重新排列。

两个操作不同,当且仅当选取的子序列不同或者重新排列的方式不同。对于所有不同的操作,求他们产生的排列的逆序对个数和,答案对$10^9+7$​取模。

题解

首先,看到这个题目我们发现整体方案数并不好枚举,所以说考虑拆分贡献。

我们先思考朴素的 $O(n^3)$ 的做法,我们枚举 $3$ 个元素分别为目前逆序对会产生贡献的两个数字,以及目前选了多少个数字。我们设 $pos_i$ 为 $i$ 这个值在序列中的位置那么我们就可以得到以下式子。

  1. $pos_i$$>pos_j$​

方案数分别为我们只影响到 $2$ 个数字,的贡献要算 $4$ 倍是因为这两个点不一定全部都要在交换序列中,因为他们本身顺序都是一样的。然后就是我们影响到 $3$ 个位置的,有几种情况。分别是 $i$ 动 $j$ 不动,$i$ 不动 $j$ 动,$i$ 到 $j$ 的位置 $j$ 动, $j$ 到 $i$ 的位置 $i$ 动,情况数也是好统计的,和之前的差不多可以自行证明。最后就是 $4$ 个位置的情况,也很简单,直接枚举除了 $i,j$ 两个点的位置即可。 唯一需要注意的是有些时候有些位置并不需要在选择的需要排列的序列中导致的贡献增加,记得细心推式子。
$$
4\sum\limits_{i=1}{n}\sum\limits_{j=i+1}\sum\limits_{k=2}{n}C{k-2}(k-2)!
+2\sum\limits
{n}\sum\limits_{j=i+1}\sum\limits_{k=3}{n}C{k-3}(k-3)!(n-pos_j-1)
+2\sum\limits
{n}\sum\limits_{j=i+1}\sum\limits_{k=2}{n}C{k-3}(k-3)!(pos_i-2)
+\sum\limits
{n}\sum\limits_{j=i+1}\sum\limits_{k=2}{n}C{k-3}(k-3)!(pos_j-1)
+\sum\limits
{n}\sum\limits_{j=i+1}\sum\limits_{k=2}{n}C{k-3}(k-3)!(n-pos_i)
+\sum\limits
{n}\sum\limits_{j=i+1}\sum\limits_{k=2}{n}C_{k-4}(k-4)!\frac{(n-3)\times(n-2)}{2}
$$

  1. $pos_i<pos_j$​

情况和上述差别不大可以自行推导。
$$
\sum\limits_{i=1}{n}\sum\limits_{j=i+1}\sum\limits_{k=2}{n}C{k-2}(k-2)!
+2\sum\limits
{n}\sum\limits_{j=i+1}\sum\limits_{k=3}{n}C{k-3}(k-3)!(n-pos_j)
+2\sum\limits
{n}\sum\limits_{j=i+1}\sum\limits_{k=2}{n}C{k-3}(k-3)!(pos_i-1)
+\sum\limits
{n}\sum\limits_{j=i+1}\sum\limits_{k=2}{n}C{k-3}(k-3)!(pos_j-2)
+\sum\limits
{n}\sum\limits_{j=i+1}\sum\limits_{k=2}{n}C{k-3}(k-3)!(n-pos_i-1)
+\sum\limits
{n}\sum\limits_{j=i+1}\sum\limits_{k=2}{n}C_{k-4}(k-4)!\frac{(n-3)\times(n-2)}{2}
$$
我们可以发现其实后面的 $k$ 其实可以不用枚举,每一次的结果都是一样的,系数也是相同所以可以直接预处理就可以把时间复杂度降到 $O(n^2)$。

最后我们发现其实我们只用枚举 $i$ ,但其实 $j$ 的加起来的和和数量是可以维护的,所以说只需要写一个树状数组维护即可。时间复杂度降到了 $O(n\log n)$。可以通过此题。

标签:limits,题解,sum,pos,枚举,随机,序列,逆序
From: https://www.cnblogs.com/cqyc-sol/p/18066154

相关文章

  • leetcode 528/ LCR 071 按权重随机选择
    leetcode528/LCR071按权重随机选择528.按权重随机选择LCR071.按权重随机选择题目描述给定一个正整数数组w,其中w[i]代表下标i的权重(下标从0开始),请写一个函数pickIndex,它可以随机地获取下标i,选取下标i的概率与w[i]成正比。例如,对于w=[1,3],挑选下标0......
  • 【蓝桥-大试牛刀7-最短路专场】题解
    最短路1floyd说白了就是个暴力,用三层循环枚举所有路径,然后留下权值最小的一条大概就长这个样for(中转点k) for(起点i) for(终点j) d[i][j]=min(d[i][j],d[i][k]+d[k][j]);注意这个题的数据有重边,输入的时候留下最小的,这样就做完了intd[N][N];voidsolve(){......
  • LeetCode 128.最长连续序列 Python题解
    leetcode128题最长连续序列分享解题思路,使用哈希表算法......
  • 2024年3月10号题解
    299.猜数游戏解题思路对出现的数字在两个数组中进行统计先计算公牛的个数,如果有那么统计的数字的数量对应减一,因为统计是用来算奶牛的数量的遍历统计数组,奶牛的数量加上两个数组中最小的值,因为是匹配,所以不可能多出来的也可以匹配,所以是加上其中的最小值代码实现intmin(i......
  • 常见问题解决 --- 海康OpenAPI安全认证库的demo运行报错
    我要开发一个对接海康isc平台的oss的api,发现需要有海康登录库和ak、sk的配合才能完成。在海康官方下载OpenAPI安全认证库(JAVA)V1.1.11,解压后用idea打开demo发现一对报错。解决办法:1.修复基本的错误。比如包名报错,应该是  packagega; 2.修复maven依赖导入报错。首先是artem......
  • [省选联考 2024] 重塑时光 题解
    考虑这题是什么意思,其实就是让你把DAG划分成若干个集合,点之间连边转化为对应集合之间连边以后图仍然是一个DAG,然后需要知道划分成了多少个集合,每种集合的个数求出方案数,乘上对应的系数并求和。系数是很显然的,即:\[{k+1\choosei}\frac{i!k!}{n!\prod_{i=1}^k(n+i)}\]考虑怎......
  • [省选联考 2024] 迷宫守卫 题解
    首先Bob肯定是贪心操作,即如果能操作且右儿子中第一个数小于左儿子中的第一个数就一定操作(因为排列中的数两两不同),否则不操作。考虑一个dp,即\(f_{i,j}\)表示\(i\)中的子树操作完以后使得第一个数为\(j\)的最小代价。发现总状态数是\(\mathcalO(2^nn)\)的,对于一个点的......
  • [省选联考 2024] 魔法手杖 题解
    首先有个很显然的\(\mathcalO(nk^2)\)的做法,即二分答案,然后trie树上判断。对于trie树上一颗子树内的判定,考虑当前二分的\(\text{mid}\)这一位是\(1\)还是\(0\)以及\(x\)这一位填什么。对于\(1\)的情况,如果填\(0\),那么右儿子仍然合法,左儿子中的数必须要放到......
  • [省选联考 2024] 季风 题解
    \(\large\textbf{Statement.}\)求出最小的非负整数\(m\),使得:\[\left|x-\sum_{i=0}^{m-1}x_{i\bmodn}\right|+\left|y-\sum_{i=0}^{m-1}y_{i\bmodn}\right|\lemk\]\(\large\textbf{Solution.}\)考虑枚举\(m\bmodn\),然后求和就转化成了一段前缀和加上整个序列和的若......
  • Gym-101915D 题解
    D给定一张图,分为左右各\(P\)个点,左右各自内部是一个完全图,左右之间有\(m\)条边。求这个图的最大团。\(P\le20,m\leP^2\)。对于每个右部点,求出一个长度为\(20\)的二进制数,第\(i\)位是\(1\)表示它与左部第\(i\)点有连边。枚举右部点的子集\(S\),将它们的二进制数......