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 翻译