【NOI2018】冒泡排序 排行榜
时间限制: 1 s
空间限制: 524288 KB
题目背景
最近,小S对冒泡排序产生了浓厚的兴趣。为了问题简单,小 S 只研究对 $1$ 到 $n$ 的排列的冒泡排序。
下面是对冒泡排序的算法描述。
冒泡排序的交换次数被定义为交换过程的执行次数。可以证明交换次数的一个下界是 $\frac{1}{2}\sum_{i=1}^{n}{|i-p_i|}$,其中$p_i$ 是排列 $p$ 中第 $i$ 个位置的数字。如果你对证明感兴趣,可以看提示。
题目描述
小S开始专注于研究长度为 $n$ 的排列中,满足 交换次数$=\frac{1}{2}\sum_{i=1}^{n}{|i-p_i|}$ 的排列(在后文中,为了方便,我们把所有这样的排列叫“好”的排列)。他进一步想,这样的排列到底多不多?它们分布的密不密集?
小S想要对于一个给定的长度为 $n$ 的排列 $q$,计算字典序严格大于 $q$ 的“好”的排列个数。但是他不会做,于是求助于你,希望你帮他解决这个问题,考虑到答案可能会很大,因此只需输出答案对 $998244353$ 取模的结果。
输入格式
从标准输入读入数据。
输入第一行包含一个正整数 $T$,表示数据组数。
对于每组数据,第一行有一个正整数 $n$, 保证 $n \le 6 \times 10^{5}$。
接下来一行会输入 $n$ 个正整数,对应于题目描述中的 $q_i$,保证输入的是一个$1$ 到 $n$ 的排列。
输出格式
输出到标准输出。
输出共 $T$ 行,每行一个整数。
对于每组数据,输出一个整数,表示字典序严格大于 $q$ 的“好”的排列个数对 998244353 取模的结果。
样例一
输入
输出
解释
字典序比 $1~~3~~2$ 大的排列中,除了 $3~~2~~1$ 以外都是“好”的排列,故答案为 3。
样例二
输入
输出
子任务
下面是对本题每个测试点的输入规模的说明。
对于所有数据,均满足 $T = 5$ (样例可能不满足).
记 $n_{max}$ 表示每组数据中 $n$ 的最大值,$\sum{n}$ 表示所有数据的 $n$ 的和。
测试点 | $n\_{max}=$ | $\sum n\leq$ | 特殊性质 |
---|---|---|---|
1 | $8$ | $5n\_{max}$ | $\text{无}$ |
2 | $9$ | ||
3 | $10$ | ||
4 | $12$ | ||
5 | $13$ | ||
6 | $14$ | ||
7 | $16$ | ||
8 | |||
9 | $17$ | ||
10 | $18$ | ||
11 | |||
12 | $122$ | $700$ | $\forall i ~~q_i=i$ |
13 | $144$ | $\text{无}$ | |
14 | $166$ | ||
15 | $200$ | ||
16 | $233$ | ||
17 | $777$ | $4000$ | $\forall i ~~q_i=i$ |
18 | $888$ | $\text{无}$ | |
19 | $933$ | ||
20 | $1000$ | ||
21 | $266666$ | $2000000$ | $\forall i ~~q_i=i$ |
22 | $333333$ | $\text{无}$ | |
23 | $444444$ | ||
24 | $555555$ | ||
25 | $600000$ |
提示
下面是对交换次数下界是 $\frac{1}{2}\sum_{i=1}^{n}{|i-p_i|}$ 的证明。
排序本质上就是数字的移动,因此排序的交换次数应当可以用数字移动的总距离来描述。对于第 $i$ 个位置,假设在初始排列中,这个位置上的数字是 $p_i$,那么我们需要将这个数字移动到第 $p_i$ 个位置上,移动的距离是 $|i - p_i|$。从而移动的总距离就是 $\sum_{i=1}^n |i - p_i|$,而冒泡排序每次会交换两个相邻的数字,每次交换可以使移动的总距离至多减少 2。因此 $\frac{1}{2}{\sum_{i=1}^{n}{|i-p_i|}}$ 是冒泡排序的交换次数的下界。
并不是所有的排列都达到了下界,比如在 $n=3$ 的时候,考虑排列 $3 ~~ 2~~1$, 这个排列进行冒泡排序以后的交换次数是 3,但是 $\frac{1}{2}\sum_{i=1}^{n}{|i-p_i|}$ 只有 2。
题目来源
NOI 2018 Day 1
关于接口中的数组初值说明(最后更新:2023年2月6日)
若题目要求实现函数接口,且该函数中存在仅用于输出的数组(如 void solve(int n, const int *in, int *out)
中的 out
),那么除非另外说明,否则该数组在程序启动时的初值为 0
。
关于标准输出的说明(最后更新:2018年10月23日)
标准输出将被重定向到内存中,所以你的内存使用量也包括了你的标准输出的大小(向上取整到 4KB 的倍数)。
如果你的程序要进行大量输出,请考虑这一点。
关于提交的说明
你提交的代码将会被公开,所有人都可见。如果这不是你所期望的,或者如果想要删除已提交的代码,请联系管理员。
Judge Duck Online | 评测鸭在线
Server Time: 2024-12-04 16:21:55 | Loaded in 0 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠