CF2271E Array Emptying

题目描述

给定一个长度为 $n$ 的数组 $a$ 和一个整数 $k$。 每次操作,你可以选择数组中的任意一个元素 $x$,进行如下操作: - 如果 $x \le k$,则将 $x$ 从数组中删除。 - 否则,将 $x$ 从数组中删除,并插入两个等于 $\left\lceil \dfrac{x}{2} \right\rceil$ 的元素。 无论进行哪种操作,操作结束后 $k$ 都要加 $1$。 请你求出将数组清空所需的最少操作次数。

输入格式

每个测试点包含多组测试用例。第一行包含一个整数 $t$($1 \le t \le 10^4$),表示测试用例数。 每组测试用例的第一行包含两个整数 $n$ 和 $k$($1 \le n \le 2 \times 10^5$,$0 \le k \le n$),分别表示数组的长度和初始 $k$ 的值。 第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($1 \le a_i \le n$),表示数组的元素。 保证所有测试用例中 $n$ 的总和不超过 $2 \times 10^5$。

输出格式

对于每组测试用例,输出一个整数,表示将数组清空所需的最少操作次数。

说明/提示

在第一个样例中,初始时 $k = 0$。可以按如下顺序操作: 1. 将一个 $4$ 拆分成两个 $2$,$k$ 变成 $1$。 2. 删除一个 $1$,$k$ 变成 $2$。 3. 删除一个 $2$,$k$ 变成 $3$。 4. 删除一个 $2$,$k$ 变成 $4$。 5. 删除一个 $4$,$k$ 变成 $5$。 6. 删除一个 $4$,$k$ 变成 $6$。 该数组在 $6$ 次操作后被清空。 在第四个样例中,初始时 $k = 2$。可以按如下顺序操作: 1. 将一个 $6$ 拆分成两个 $3$,$k$ 变成 $3$。 2. 删除一个 $3$,$k$ 变成 $4$。 3. 删除一个 $3$,$k$ 变成 $5$。 4. 删除一个 $5$,$k$ 变成 $6$。 5. 删除一个 $6$,$k$ 变成 $7$。 6. 删除一个 $6$,$k$ 变成 $8$。 7. 删除一个 $6$,$k$ 变成 $9$。 8. 删除一个 $6$,$k$ 变成 $10$。 该数组在 $8$ 次操作后被清空。 由 ChatGPT 5 翻译