B2. Wonderful Coloring - 2

https://codeforces.com/contest/1551/problem/B2

题意:给定数字n和k以及n个数,现在要对n个数进行上色,颜色共有k种,要求每种颜色不能上重复的数字,并且每种颜色涂染的数字的数量相同,求染色数字最多的方案数。

思路:按数字出现的次数从高到低对数组进行排序,得到排序后的数组s,然后双指针依次考虑当前的元素s[i],[i, i + k - 1]均匀的分配给k个颜料,可以保证没有每个颜料没有重复的元素,并且每个颜料染色的数量均等的增加。 随后,从i + k开始判定,所有与s[i]相等的数字不上色,一直到当前的i到数字末尾不够k个元素为止。

总结:题目有点绕,总的核心点是,要让相同的元素相邻,然后暴力的k个k个的提取就行了。还有注意在sort排序时,lambda函数接受的不是下标,而是当前数组的元素,要特判cnt[i] == cnt[j]的情况。

inline void solve() {
    int n, k;
    cin >> n >> k;

    vector<int> a(n), cnt(n + 1);
    for (auto& x : a) {
        cin >> x;
        cnt[x] ++;
    }

    auto s = a;
    sort(s.begin(), s.end(), [&](const int i, const int j) {
        return cnt[i] != cnt[j] ? cnt[i] > cnt[j] : i > j;
    });

    map<int, vector<int>> ans;
    for (int i = 0; i + k - 1 < n;) {
        int v = s[i];
        int now = 1;
        int j;
        for (j = i; j < i + k; ++j) {
            ans[s[j]].push_back(now++);
        }
        while (j < n && s[j] == v) {
            j ++;
        }
        i = j;
    }

    for (int i = 0; i < n; ++i) {
        if (ans[a[i]].empty()) {
            cout << 0;
        }
        else {
            cout << ans[a[i]].back();
            ans[a[i]].pop_back();
        }

        cout << " \n"[i == n - 1];
    }

}
posted @ 2025-06-26 10:25  _Yxc  阅读(14)  评论(0)    收藏  举报