B. Quick Sort

You are given a permutation【排列】† \(p\) of length \(n\) and a positive integer \(k≤n\).

In one operation, you:

Choose \(k\) distinct elements【不连续的元素】 \(p_{i1},p_{i2},…,p_{ik}\).

Remove them and then add them sorted in increasing order to the end of the permutation.

For example, if \(p=[2,5,1,3,4]\) and \(k=2\) and you choose \(5\) and \(3\) as the elements for the operation, then \([2,5,1,3,4]→[2,1,4,3,5]\).

Find the minimum number of operations needed to sort the permutation in increasing order【递增次序】. It can be proven that it is always possible to do so.

† A permutation of length \(n\) is an array consisting of \(n\) distinct integers from \(1\) to \(n\) in arbitrary order. For example, \([2,3,1,5,4]\) is a permutation, but \([1,2,2]\) is not a permutation (2 appears twice in the array), and \([1,3,4]\) is also not a permutation (\(n=3\) but there is \(4\) in the array).

Input

The first line contains a single integer \(t (1≤t≤10^4)\) — the number of test cases. The description of test cases follows.

The first line of each test case contains two integers \(n\) and \(k (2≤n≤10^5, 1≤k≤n)\).

The second line of each test case contains \(n\) integers \(p_1,p_2,…,p_n (1≤pi≤n)\). It is guaranteed that \(p\) is a permutation.

It is guaranteed that the sum of n over all test cases does not exceed \(10^5\).

Output

For each test case output a single integer — the minimum number of operations needed to sort the permutation. It can be proven that it is always possible to do so.

Example

input

4

3 2

1 2 3

3 1

3 1 2

4 2

1 3 2 4

4 2

2 3 1 4

output

0

1

1

2

Note

In the first test case, the permutation is already sorted.

In the second test case, you can choose element \(3\), and the permutation will become sorted as follows: \([3,1,2]→[1,2,3]\).

In the third test case, you can choose elements \(3\) and \(4\), and the permutation will become sorted as follows: \([1,3,2,4]→[1,2,3,4]\).

In the fourth test case, it can be shown that it is impossible to sort the permutation in \(1\) operation. However, if you choose elements \(2\) and \(1\) in the first operation, and choose elements \(3\) and \(4\) in the second operation, the permutation will become sorted as follows: \([2,3,1,4]→[3,4,1,2]→[1,2,3,4]\).

原题链接

简述题意

  • 给出一个长度为\(n\)的不连续排列,通过每次移动\(k\)个数并排序放在排列的最后面,确保一定次数内一定可以使得排列正序,问最小操作数为几?

思路

  1. 如果需要最小化操作数,那么不需要移动的元素个数应该最大化,即找到{1,2,...}的maximal subsequence【最大子序列】的元素个数
  2. 我们可以在遍历过程中维护相对顺序来找到最大子序列的元素个数
  3. 结果是遍历一遍记录不满足相对顺序的个数除以每次可移动的个数向上取整
  4. 需要注意是:向上取整要先乘1.0,否则结果会先向下取整再向上取整

代码

点击查看代码
#include<iostream>
#include<cmath> #define endl '\n'
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
int k,t,n;
int a[N];
LL ans; int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> t; while(t -- ){
ans = 0;
cin >> n >> k;
for(int i = 1; i <= n; i ++)cin >> a[i];
int t = 0,m = 0;
for(int i = 1; i <= n; i ++){
if(a[i] != i - t){
m ++; //不满足相对顺序的数的个数
t ++; //维护相对顺序
}
}
cout << ceil(m * 1.0 / k) << endl; //注意:向上取整要先乘1.0,否则结果会先向下取整再向上取整
}
}

标准答案

点击查看代码
#include <bits/stdc++.h>	

#define all(x) (x).begin(), (x).end()
#define allr(x) (x).rbegin(), (x).rend()
#define gsize(x) (int)((x).size()) const char nl = '\n'; //简写换行
typedef long long ll;
typedef long double ld; using namespace std; void solve() {
int n, k;
cin >> n >> k;
vector<int> p(n); //动态数组
for (int i = 0; i < n; i++) cin >> p[i]; int c_v = 1;
for (int i = 0; i < n; i++) {
if (p[i] == c_v) c_v++;
} cout << (n - c_v + k) / k << nl;
} int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int T;
cin >> T;
while (T--) solve();
}

解题历程

  1. 考虑了相对顺序但是结果计算方式错误
  2. AC(46 ms,3900 KB) 【00:57 - 01:29】 //二次思考

经验总结

  1. 向上取整要先乘1.0,否则结果会先向下取整再向上取整
  2. 注意如何维护相对顺序
  3. 不要盲目模拟过程

B. Quick Sort【Codeforces Round #842 (Div. 2)】的更多相关文章

  1. A. Greatest Convex【Codeforces Round #842 (Div. 2)】

    A. Greatest Convex You are given an integer \(k\). Find the largest integer \(x\), where \(1≤x<k\ ...

  2. 【Codeforces Round #406 (Div. 2)】题解

    The Monster 签到题,算一下b+=a和d+=c,然后卡一下次数就可以了. Not Afraid 只要一组出现一对相反数就是安全的. Berzerk 题意:[1,n],两个人轮流走,谁能走到1 ...

  3. 【Codeforces Round #411 (Div. 1)】Codeforces 804C Ice cream coloring (DFS)

    传送门 分析 这道题做了好长时间,题意就很难理解. 我们注意到这句话Vertices which have the i-th (1 ≤ i ≤ m) type of ice cream form a ...

  4. 【Codeforces Round#279 Div.2】B. Queue

    这题看别人的.就是那么诚实.http://www.cnblogs.com/zhyfzy/p/4117481.html B. Queue During the lunch break all n Ber ...

  5. 【Codeforces Round #405 ( Div 2)】题解

    Bear and Big Brother 签到题,直接模拟就可以了. Bear and Friendship Condition 满足只能是每个朋友圈中每个人和其他人都是朋友,这样的边数的确定的. 然 ...

  6. 【Codeforces Round #404 (Div. 2)】题解

    A. Anton and Polyhedrons 直接统计+答案就可以了. #include<cstdio> #include<cstring> #include<alg ...

  7. 【Codeforces Round #518 (Div. 2)】

    A:https://www.cnblogs.com/myx12345/p/9847588.html B:https://www.cnblogs.com/myx12345/p/9847590.html ...

  8. 【Codeforces Round #506 (Div. 3) 】

    A:https://www.cnblogs.com/myx12345/p/9844334.html B:https://www.cnblogs.com/myx12345/p/9844368.html ...

  9. 【Codeforces Round #503 (Div. 2)】

    A:https://www.cnblogs.com/myx12345/p/9843198.html B:https://www.cnblogs.com/myx12345/p/9843245.html ...

随机推荐

  1. Linux crontab定时任务设置

    1.检查是否安装了crontab # rpm -qa | grep crontab 2.重启crontab服务 一定重启,这样确保了crontab服务的开启 # /etc/init.d/crond r ...

  2. Linux家族谱系

    I II III VI unix linux Redhat Centos   Debian Ubuntu   SUSE   Android   BSD freeBSD NetBSD openBSD   ...

  3. 在CentOs7虚拟机Linux离线安装mysql5.6(亲测可用)

    在该博主博客的的基础上进一步改进:https://blog.csdn.net/zhousq8929/article/details/117223255 文章目录 1.在官网下载mysql-5.6.36 ...

  4. LeetCode------移动零(5)【数组】

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/move-zeroes 1.题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末 ...

  5. 【单片机入门】(四)应用层软件开发的单片机学习之路-----ESP32开发板PWM控制电机以及中断的使用

    引言 各位大佬,晚上好啊,在上一篇博客中,我们讲了什么是UART串口通讯,以及使用USB转TTL使得单片机可以和c#上位机做一个串口通讯,接下来,为大家带来PWM的概念原理,以及实际案例,使用PWM对 ...

  6. Qt--无边框窗口完美(FrameLess)实现,包含缩放和移动功能重写。

    前言 Qt原本的窗口虽然可以通过QSS样式进行美化,但是只是对客户区有用,对于客户区是无效的.所以想做出一个比较好看的程序,还得自己重写实现无边框窗口. Qt实现无边框其实一句代码就可以,但是窗口自带 ...

  7. JAVA语言学习-面向对象(1)

    类与对象 类 类是JAVA语言中重要的复合型数据类型().类的实现包括两个部分:成员变量和成员方法("方法"可以看作是C语言中的函数) 类的声明 要使用类,首先得对其声明.声明一个 ...

  8. ABAP 调用HTTP上传附件

    1.需求说明 在SAP中调用第三方文件服务器的HTTP请求,将文件保存在文件服务器上,并返回保存的文件地址.SAP保存返回的文件地址,通过浏览器进行访问. 2.需求实现 2.1.POSTMAN测试 通 ...

  9. CC1,3,6回顾

    前言 前面陆续学习了CC1,CC3,CC6,以及TemplatesImpl以及改造,有点乱,正所谓温故而知新嘛,所以这篇就回顾一下,捋一捋,解决一些细节问题. CC1 由于CC1要介绍CC链的几个关键 ...

  10. jquery实现复选框的全选与取消全选功能

    HTML代码 首先创建一个表格: <table class="table table-bordered table-hover"> <tr> <th& ...