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;
}

浙公网安备 33010602011771号