思路:
贪心加模拟
code:
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define ld long double
#define all(x) x.begin(), x.end()
#define eps 1e-6
using namespace std;
const int maxn = 2e5 + 9;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll n, m;
ll a[maxn], ans[maxn];
void work()
{
cin >> n;
unordered_map<int,int> ma;
for(int i = 1, x; i <= n; ++i) cin >> x, ans[i] = 0, ma[x]++;
ans[0] = 0;
priority_queue <pair<int,int> > q;
for(int i = 0; i <= n; ++i)
{
if(i > 0 && !ma[i-1])
{
if(q.empty())
{
for(int j = i; j <= n; ++j) ans[j] = -1;
break;
}
else
{
pair<int,int> now = q.top();q.pop();
ans[i] = ans[i-1] + i - 1 - now.first + ma[i];
if(--now.second >= 1) q.push({now.first, now.second});
if(ma[i] > 1) q.push({i, ma[i] - 1});
continue;
}
}
ans[i] = ma[i];
if(i > 0) ans[i] += ans[i-1] - ma[i-1];
if(ma[i] > 1) q.push({i, ma[i] - 1});
}
for(int i = 0; i <= n; ++i) cout << ans[i] << " ";cout << endl;
}
/*
test_2 case_70:
1
8
0 2 4 0 8 4 2 5
*/
int main()
{
ios::sync_with_stdio(0);
int TT;cin>>TT;while(TT--)
work();
return 0;
}
本文介绍了一个名为E.MEXandIncrements的问题解决思路,采用贪心算法结合模拟的方法来解决问题。通过使用C++实现代码逻辑,文章详细展示了如何通过优先队列和哈希表等数据结构来高效地完成任务。
1713

被折叠的 条评论
为什么被折叠?



