[LSOT-2] 基于二分查找与插入的快速排序
题目背景
小 H 不会排序,但是会二分!
于是他创造了一个基于二分查找与插入的快速排序。
本题存在可带修做法,因为这题是这场考试的签到题所以良心出题人没有加上。
题目描述
给定一个排列 p p p。每次可以选择一个数 p i p_i pi,你需要找到最小的 j j j,使得 j > i j>i j>i 且 p j > p i p_j>p_i pj>pi,并将 p i p_i pi 插入到 p j p_j pj 前面。你需要最小化使得 p i = i p_i=i pi=i 的操作次数。
若不存在这样的 j j j,则无法进行操作。
输入格式
第一行一个整数 n n n,表示排列的长度。
接下来一行 n n n 个整数描述排列 p p p,第 i i i 个数为 p i p_i pi。
输出格式
一行一个整数表示最小的操作次数。若无法完成排序输出 − 1 -1 −1。
样例 #1
样例输入 #1
5
3 1 4 2 5
样例输出 #1
2
提示
「本题采用捆绑测试」
- Subtask 1(20pts): n ≤ 10 \texttt{Subtask 1(20pts):}n\le10 Subtask 1(20pts):n≤10。
- Subtask 2(20pts): \texttt{Subtask 2(20pts):} Subtask 2(20pts):保证 p i = n − i + 1 p_i=n-i+1 pi=n−i+1。
- Subtask 3(20pts): n ≤ 1000 \texttt{Subtask 3(20pts):}n\le1000 Subtask 3(20pts):n≤1000。
- Subtask 4(40pts): \texttt{Subtask 4(40pts):} Subtask 4(40pts):无特殊性质。
对于全部的数据, 1 ≤ n ≤ 2 × 1 0 6 1\le n\le2\times 10^6 1≤n≤2×106, p p p 是一个 1 1 1 到 n n n 的排列。
Scratch实现
后续
接下来我会不断用scratch来实现信奥比赛中的算法题、Scratch考级编程题实现、白名单赛事考题实现,感兴趣的请关注,我后续将继续分享相关内容