#1314. 切胡萝卜(Hard)

    ID: 1314 传统题 1000ms 256MiB 尝试: 8 已通过: 2 难度: 普及 上传者: 标签>数学贪心基础算法模拟前缀和

切胡萝卜(Hard)

题目描述

这是该问题的困难版本。与简单版本不同的是,你需要分别求解 k=1,2,…,mk = 1, 2, \dots, m 时的答案。

你有 nn 根胡萝卜,它们的初始长度分别为 a1,a2,…,ana_1, a_2, \dots, a_n。为了把这些胡萝卜卖给一个只想要长度完全相同的胡萝卜的顾客,你需要使用一台切菜机对胡萝卜进行处理。

切菜机的工作规则如下:

  • 在每次操作中,你可以选择任意一个胡萝卜的集合(切开后的胡萝卜也可以再次被选择)以及一个正整数 xx(每次操作选定的 xx 可以不同)。
  • 接着,对于被选中的每一根胡萝卜(设其当前长度为 ll):
    • 如果 l≤xl \le x,该胡萝卜保持不变;
    • 如果 l>xl > x,该胡萝卜将被切分为两根长度分别为 xx 和 l−xl-x 的胡萝卜。

请问对于每个 k∈{1,2,…,m}k \in \{1, 2, \dots, m\},如果恰好使用切菜机 kk 次,你最多能得到多少根长度完全相同的胡萝卜?请对每个 kk 独立求解。

输入格式

第一行包含一个整数 tt(1≤t≤1041 \le t \le 10^4)—— 测试用例的数量。

对于每个测试用例:

  • 第一行包含两个正整数 nn 和 mm(1≤n,m≤2×1051 \le n, m \le 2 \times 10^5)—— 分别表示胡萝卜的数量以及需要求解的最大操作次数 mm(同时也是胡萝卜的最大可能长度)。
  • 第二行包含 nn 个正整数 a1,a2,…,ana_1, a_2, \dots, a_n(1≤ai≤m1 \le a_i \le m)—— 表示每根胡萝卜的初始长度。

输出格式

对于每个测试用例,输出一行 mm 个整数,相邻整数之间用一个空格隔开,依次表示当 k=1,2,…,mk = 1, 2, \dots, m 时,能得到的具有相同长度的胡萝卜的最大数量。

样例输入 1

6
5 4
1 2 3 4 4
5 8
1 1 8 8 8
1 8
6
7 9
1 7 5 1 7 5 3
4 1
1 1 1 1
3 5
3 1 5

样例输出 1

6 14 14 14
6 12 26 26 26 26 26 26
2 3 6 6 6 6 6 6
7 17 29 29 29 29 29 29 29
4
3 7 9 9 9

说明

样例解释

在第一个测试用例中,给定的胡萝卜长度为 [1,2,3,4,4][1, 2, 3, 4, 4]。

  • 当 k=1k=1 时,最优的选择是取 x=2x=2,并选择胡萝卜集合 [2,3,4,4][2, 3, 4, 4] 进行操作。操作完成后,所有的胡萝卜长度变为 [1,2,2,1,2,2,2,2][1, 2, 2, 1, 2, 2, 2, 2]。此时我们总共拥有 66 根长度为 22 的胡萝卜,因此答案为 66。
  • 当 k=2k=2 时,第一步操作同上,取 x=2x=2 并选择集合 [2,3,4,4][2, 3, 4, 4],得到 [1,2,2,1,2,2,2,2][1, 2, 2, 1, 2, 2, 2, 2]。第二步操作取 x=1x=1 并选择所有现有的胡萝卜。这会把所有长度为 22 的胡萝卜全部切成两根长度为 11 的胡萝卜。最终会得到 1414 根长度均为 11 的胡萝卜,因此答案为 1414。

数据范围

  • 对于所有测试点,保证 1≤t≤1041 \le t \le 10^4。
  • 对于每个测试用例,保证 1≤n,m≤2×1051 \le n, m \le 2 \times 10^5。
  • 对于每个测试用例,保证 1≤ai≤m1 \le a_i \le m。
  • 保证同一测试点内所有测试用例的 nn 之和不超过 2×1052 \times 10^5,所有测试用例的 mm 之和也不超过 2×1052 \times 10^5。
  • 保证所有的输入数值均为整数。