CF1342D Multiple Testcases

题目

给你 \(n\)\([1,k]\) 中的整数 \(a_1,a_2, \cdots ,a_n\),再给你 \(k\) 个正整数 \(b_1,b_2, \cdots ,b_k\)\(b_1 \ge b_2 \ge \cdots \ge b_k\))。你需要把 \(a_1,a_2, \cdots ,a_n\) 分组,使得每组中大于等于 \(i\) 的数不超过 \(b_i\) 个。求最少分几组,并给出一个方案。

数据范围

\(1 \le n,k \le 2 \cdot 10^5\)

限制

时间:2s

空间:512M

代码

# include <bits/stdc++.h>

using namespace std;
using pii = pair<int, int>;
const int MAXN = 2e5 + 5;

int n, k;
int a[MAXN], b[MAXN];
vector<int> v[MAXN];
priority_queue<pii, vector<pii>, greater<pii>> q;

int main()
{
    scanf("%d %d", &n, &k);
    for (int i = 0; i < n; ++i)
    {
        scanf("%d", &a[i]);
    }
    for (int i = 1; i <= k; ++i)
    {
        scanf("%d", &b[i]);
    }

    sort(a, a + n, greater<int>());
    q.push({0, 1});
    int ans = 1;
    for (int i = 0; i < n; ++i)
    {
        pii p = q.top();
        q.pop();
        if (p.first < b[a[i]])
        {
            v[p.second].push_back(a[i]);
            ++p.first;
        }
        else
        {
            v[++ans].push_back(a[i]);
            q.push({1, ans});
        }
        q.push(p);
    }

    printf("%d\n", ans);
    for (int i = 1; i <= ans; ++i)
    {
        printf("%d", v[i].size());
        for (int j : v[i])
        {
            printf(" %d", j);
        }
        printf("\n");
    }

    return 0;
}
posted @ 2020-05-26 11:04  Handlip  阅读(98)  评论(0)    收藏  举报