#P50939. 「ROI 2018 Day 2」快速排序

「ROI 2018 Day 2」快速排序

题目描述

译自 ROI 2018 Day2 T2. Быстрая сортировка (Quick sort)

给一个包含 nn 个元素的排列 [a1,[a_1, a2,a_2, ,\ldots, an]a_n]
定义操作 S(l,S(l, r),r), 表示:将数列的片段 [al,[a_l, al+1,a_{l+1}, ,\ldots, ar]a_r] 重排成 [al+1,[a_{l+1}, al+3,a_{l+3}, ,\ldots, al,a_l, al+2,a_{l+2}, ]\ldots]
举个例子:[2,4,1,5,3,6,7,8]S(2,6)[2,1,3,4,5,6,7,8],[2, 4, 1, 5, 3, 6, 7, 8]\xrightarrow{\,S(2,6)\,} [2, 1, 3, 4, 5, 6, 7, 8], 其中子串 [4,1,5,3,6][4, 1, 5, 3, 6] 被重排成了 [1,3,4,5,6][1, 3, 4, 5, 6]
给定一个排列,试求经过多少次操作能使排列变成递增顺序,并输出任意一组方案,要求方案的操作次数最少,但要求操作次数 15000\leqslant 15000

输入格式

第一行一个整数 n (1n3000)n\ \left( 1 \leqslant n \leqslant 3000 \right),表示排列 aa 的大小。
接下来有 nn 个不同的数 a1, a2, , ana_1,\ a_2,\ \ldots,\ a_n,表示排列 aa

输出格式

第一行一个整数 kk,表示你的操作次数。 需要满足 0k150000 \leqslant k \leqslant 15000
接下来 kk 行,你需要按照操作顺序描述你的操作。对于每一步操作,输出两个数 LL, RR,表示你对片段 aL, aL+1, , aRa_L,\ a_{L+1},\ \ldots,\ a_R 执行了一次操作。 需满足 1LRn1 \leqslant L \leqslant R \leqslant n
注意,你需要最小化。你只需保证 0k150000 \leqslant k \leqslant 15000 即可。保证存在这样的 kk

样例 1

5
3 1 4 2 5
1
1 5
8
2 4 1 5 3 6 7 8
2
2 6
1 2
2
2 1
3
1 1
2 2
1 2

显然 S(1,1)S(1,1)S(2,2)S(2,2) 并没有什么卵用 举这个例子是告诉你,不要求方案的操作次数最少。

数据范围与提示

k0k_0 表示最小操作次数。
对于所有数据,1n3000,1\leqslant n\leqslant 3000, 0k015000,0\leqslant k_0\leqslant 15000, 1ain,1\leqslant a_i\leqslant n,aia_i 互不相同。

子任务编号 分值 1n1\leqslant n\leqslant 其它
1 20 100100 k0=1k_0=1
2 30 100100
3  30  10001000  
4 20 30003000