B2. Wonderful Coloring - 2<734.div3>

B2. Wonderful Coloring - 2

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

This problem is an extension of the problem "Wonderful Coloring - 1". It has quite many differences, so you should read this statement completely.

Recently, Paul and Mary have found a new favorite sequence of integers a1,a2,…,ana1,a2,…,an. They want to paint it using pieces of chalk of kk colors. The coloring of a sequence is called wonderful if the following conditions are met:

  1. each element of the sequence is either painted in one of kk colors or isn't painted;
  2. each two elements which are painted in the same color are different (i. e. there's no two equal values painted in the same color);
  3. let's calculate for each of kk colors the number of elements painted in the color — all calculated numbers must be equal;
  4. the total number of painted elements of the sequence is the maximum among all colorings of the sequence which meet the first three conditions.

E. g. consider a sequence a=[3,1,1,1,1,10,3,10,10,2]a=[3,1,1,1,1,10,3,10,10,2] and k=3k=3. One of the wonderful colorings of the sequence is shown in the figure.

The example of a wonderful coloring of the sequence a=[3,1,1,1,1,10,3,10,10,2]a=[3,1,1,1,1,10,3,10,10,2] and k=3k=3. Note that one of the elements isn't painted.

Help Paul and Mary to find a wonderful coloring of a given sequence aa.

Input

The first line contains one integer tt (1≤t≤100001≤t≤10000) — the number of test cases. Then tt test cases follow.

Each test case consists of two lines. The first one contains two integers nn and kk (1≤n≤2⋅1051≤n≤2⋅105, 1≤k≤n1≤k≤n) — the length of a given sequence and the number of colors, respectively. The second one contains nn integers a1,a2,…,ana1,a2,…,an (1≤ai≤n1≤ai≤n).

It is guaranteed that the sum of nn over all test cases doesn't exceed 2⋅1052⋅105.

Output

Output tt lines, each of them must contain a description of a wonderful coloring for the corresponding test case.

Each wonderful coloring must be printed as a sequence of nn integers c1,c2,…,cnc1,c2,…,cn (0≤ci≤k0≤ci≤k) separated by spaces where

  • ci=0ci=0, if ii-th element isn't painted;
  • ci>0ci>0, if ii-th element is painted in the cici-th color.

Remember that you need to maximize the total count of painted elements for the wonderful coloring. If there are multiple solutions, print any one.

Example

input

Copy

6
10 3
3 1 1 1 1 10 3 10 10 2
4 4
1 1 1 1
1 1
1
13 1
3 1 4 1 5 9 2 6 5 3 5 8 9
13 2
3 1 4 1 5 9 2 6 5 3 5 8 9
13 3
3 1 4 1 5 9 2 6 5 3 5 8 9

output

Copy

1 1 0 2 3 2 2 1 3 3
4 2 1 3
1
0 0 1 1 0 1 1 1 0 1 1 1 0
2 1 2 2 1 1 1 1 2 1 0 2 2
1 1 3 2 1 3 3 1 2 2 3 2 0

Note

In the first test case, the answer is shown in the figure in the statement. The red color has number 11, the blue color — 22, the green — 33.

题目大意

给定一个长度为 nn 的数组 aa,取出 kk 个相离的大小相同的下标集合,集合中每个下标对应的数字需不同,最大化集合的大小,并输出方案。

题目分析

首先统计每个数字出现的次数,如果大于等于 kk 那么显然每个集合分一个,否则待定。贪心地,最后将待定的数字依次 kk 个一组分配给每个集合即可,这里可以用 vector 实现。

#include <bits/stdc++.h>
using namespace std;
int T, n, k, x, ans[200001];
vector<int>num[200001], vec;

int main() {
	cin >> T;
	while (T--) {
		cin >> n;
		cin >> k;
		for ( int i = 1; i <= n; ++i) {
			num[i].clear();
			ans[i] = 0;
		}
		vec.clear();
		for ( int i = 1; i <= n; ++i) {
			cin >> x;
			num[x].push_back(i);
		}
		for ( int i = 1; i <= n; ++i) {
			if (num[i].size() > k)
				for ( int j = 0; j < k; ++j)
					ans[num[i][j]] = j + 1;
			else {
				for ( int j = 0, up = num[i].size(); j < up; ++j)
					vec.push_back(num[i][j]);
			}
		}
		for ( int i = 0, up = vec.size(); i + k - 1 < up; i += k) {
			for ( int j = i; j < i + k; ++j)
				ans[vec[j]] = j - i + 1;
		}
		for ( int i = 1; i <= n; ++i)
			printf("%d ", ans[i]);
		puts("");
	}
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法编程张老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值