P7650 [BalticOI 2007] Ranklist Sorting (Day 1)
题目描述
在一场比赛中,你会得到几名选手的分数。你的任务是创建一个按分数递减排序的选手的排名表。
不幸的是,用于选手排名表的数据结构仅支持一种操作,即在不改变其他玩家的相对顺序的情况下将玩家从位置 $i$ 移动到位置 $j$。如果 $i > j$,则 $j$ 和 $i-1$ 之间位置的玩家位置增加 $1$,否则如果 $i < j$,则 $i+1$ 和 $j$ 之间位置的玩家位置减少 $1$。
这个操作需要 $i$ 步来定位要移动的玩家,$j$ 步来定位他或她移动到的位置,所以将一个玩家从位置 $i$ 移动到位置 $j$ 的总成本是 $i+j$。规定,位置从 $1$ 开始编号。
确定一个步法序列来创建排名表,使步法的代价之和最小化。
输入格式
第一行包含整数 $n$,即玩家数量。
接下来的 $n$ 行中的每一行都包含一个非负整数 $s_i$,即当前顺序中玩家的分数。您可以假设所有分数都是不同的。
输出格式
第一行输出用于创建排名表的移动次数。以下几行应按应用顺序指定移动,每次移动都应该用一行包含两个整数 $i$ 和 $j$ 来描述,表示位置 $i$ 的玩家被移动到位置 $j$。数字 $i$ 和 $j$ 必须用一个空格分隔。
说明/提示
#### 数据规模与约定
对于 $30 \% $ 的数据,$n \le 10$,$0 \le s_i \le 10^6$。
对于 $100 \%$ 的数据,$2 \le n \le 10^3$,$0 \le s_i \le 10^6$。
#### 题目说明
来源于 [Baltic Olympiad in Informatics 2007](https://www.boi2007.de/en/welcome) 的 [Day 1:sorting](https://www.boi2007.de/tasks/sorting.pdf)。
由 @[求学的企鹅](/user/271784) 翻译整理。