Moamen and k-subarrays (Codeforces 1557B)
Tags: Greedy, sortings

Moamen has an array of $$$n$$$ distinct integers. He wants to sort that array in non-decreasing order by doing the following operations in order exactly once:  Split the array into exactly $$$k$$$ non-empty subarrays such that each element belongs to exactly one subarray.  Reorder these subarrays arbitrary.  Merge the subarrays in their new order. A sequence $$$a$$$ is a subarray of a sequence $$$b$$$ if $$$a$$$ can be obtained from $$$b$$$ by deletion of several (possibly, zero or all) elements from the beginning and several (possibly, zero or all) elements from the end.Can you tell Moamen if there is a way to sort the array in non-decreasing order using the operations written above?

Input: The first line contains a single integer $$$t$$$ ($$$1 \le t \le 10^3$$$) — the number of test cases. The description of the test cases follows.The first line of each test case contains two integers $$$n$$$ and $$$k$$$ ($$$1 \le k \le n \le 10^5$$$).The second line contains $$$n$$$ integers $$$a_1, a_2, \ldots, a_n$$$ ($$$0 \le |a_i| \le 10^9$$$). It is guaranteed that all numbers are distinct.It is guaranteed that the sum of $$$n$$$ over all test cases does not exceed $$$3\cdot10^5$$$.

Output: For each test case, you should output a single string.If Moamen can sort the array in non-decreasing order, output "YES" (without quotes). Otherwise, output "NO" (without quotes).You can print each letter of "YES" and "NO" in any case (upper or lower).

Note: In the first test case, $$$a = [6, 3, 4, 2, 1]$$$, and $$$k = 4$$$, so we can do the operations as follows:   Split $$$a$$$ into $$$\{ [6], [3, 4], [2], [1] \}$$$.  Reorder them: $$$\{ [1], [2], [3,4], [6] \}$$$.  Merge them: $$$[1, 2, 3, 4, 6]$$$, so now the array is sorted. In the second test case, there is no way to sort the array by splitting it into only $$$2$$$ subarrays.As an example, if we split it into $$$\{ [1, -4], [0, -2] \}$$$, we can reorder them into $$$\{ [1, -4], [0, -2] \}$$$ or $$$\{ [0, -2], [1, -4] \}$$$. However, after merging the subarrays, it is impossible to get a sorted array.

Sample Inputs:
3
5 4
6 3 4 2 1
4 2
1 -4 0 -2
5 1
1 2 3 4 5

Sample Outputs:
Yes
No
Yes

Solution (Python):
import sys

def main():
    tt = int(sys.stdin.readline())
    while tt > 0:
        (n, k) = map(int, sys.stdin.readline().split())
        a = list(map(int, sys.stdin.readline().split()))
        order = list(range(n))
        order.sort(key=lambda i: a[i])
        z = n
        for i in range(n - 1):
            if order[i + 1] == order[i] + 1:
                z -= 1
        print('YES' if z <= k else 'NO')
        tt -= 1
if __name__ == '__main__':
    main()

Solution (Python):
t = int(input())
for _ in range(t):
    (n, k) = map(int, input().split())
    a = list(map(int, input().split()))
    order = list(range(n))
    order.sort(key=lambda i: a[i])
    z = n
    for i in range(n - 1):
        if order[i + 1] == order[i] + 1:
            z -= 1
    print('YES' if z <= k else 'NO')

Solution (Python):
for _ in [0] * int(input()):
    (n, k) = map(int, input().split())
    a = list(map(int, input().split()))
    order = list(range(n))
    order.sort(key=lambda i: a[i])
    z = n
    for i in range(n - 1):
        if order[i + 1] == order[i] + 1:
            z -= 1
    print('YES' if z <= k else 'NO')