#L3851. 「NOI2022」冒泡排序
「NOI2022」冒泡排序
题目背景
最近,小 Z 对冒泡排序产生了浓厚的兴趣。
下面是冒泡排序的伪代码:
输入: 一个长度为 n 的序列 a[1...n]
输出: a 从小到大排序后的结果
for i = 1 to n do:
for j = 1 to n - 1 do
if (a[j] > a[j + 1])
交换 a[j] 与 a[j + 1] 的值
冒泡排序的交换次数被定义为在排序时进行交换的次数,也就是上面冒泡排序伪代码第六行的执行次数。他希望找到一个交换次数尽量少的序列。
题目描述
小 Z 所研究的序列均由非负整数构成。它的长度为 ,且必须满足 个附加条件。其中第 个条件为:下标在 中的数,即 这些数,其最小值恰好为 。
他知道冒泡排序时常会超时。所以,他想要知道,在所有满足附加条件的序列中,进行冒泡排序的交换次数的最少值是多少。
输入格式
从文件 bubble.in 中读入数据。
本题有多组数据。
输入的第一行包含一个正整数 。
对于每组数据,第一行包含两个正整数 。数据保证 。
接下来 行,每行三个非负整数 ,表示一组附加条件。数据保证 、。
输出格式
输出到文件 bubble.out 中。
输出共 行,每行一个整数。
对于每组数据,如果存在满足这 个附加条件的序列,则输出在所有满足附加条件的序列中,冒泡排序交换次数的最小值。如果不存在满足所有条件的序列,则输出 。
样例 1
输入
1
3 2
1 1 2022
2 3 39
输出
1
解释: 这组数据的约束条件为 , 。
- 若 ,且 ,则冒泡排序只有第一轮有交换操作,这一轮交换了 和 ,总交换次数为 。
- 若 ,且 ,则冒泡排序只有第一轮有交换操作,这一轮仅仅交换 ,总交换次数为 。
- 若 ,且 ,则冒泡排序算法第一轮交换 和 ,第二轮交换 。总交换次数为 。
- 若 ,且 ,则冒泡排序算法第一轮交换 ,第二轮交换 。总交换次数为 。
因此,交换次数的最小值为 。
样例 2 ~ 6
- 样例 2 见附件中的
bubble/bubble2.in与bubble/bubble2.ans。 - 样例 3 见附件中的
bubble/bubble3.in与bubble/bubble3.ans,满足测试点 的条件。 - 样例 4 见附件中的
bubble/bubble4.in与bubble/bubble4.ans,满足测试点 的条件。 - 样例 5 见附件中的
bubble/bubble5.in与bubble/bubble5.ans,满足测试点 的条件。 - 样例 6 见附件中的
bubble/bubble6.in与bubble/bubble6.ans,满足测试点 的条件。
数据范围与提示
本题共 个测试点。全部测试点满足:
其中 分别表示所有测试点的 的总和和 的总和。 的含义类似。

特殊性质 A:对于 ,。
特殊性质 B:对于 ,。
特殊性质 C:输入给出的 个区间 两两不相交。
本题的部分测试点输入量较大。我们建议你使用较为快速的读入方式。