##题意 大概就是求对于给定的n个数的数组,求对于0-n每一个数在数组中使得当前数据是最小的正整数。每次操作让某个数加一
比如对于第一个测试样例 0 1 3
要让0 1 2 3 分别是该数组未出现的最小正整数,
对于不同的数分别求出对应最小操作次数。
对于0 让0变成1,操作一次
对于1 让1变成2 操作一次
对于2 本来就缺少2 不需要操作
对于3 无法操作
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int T,n,m,a[N],b[N];;
int main()
{
cin>>T;
while(T--)
{
cin>>n;
for(int i=1;i<=n;i++) a[i] = -1;
for(int i=1;i<=n;i++) cin >> b[i];
sort(b + 1, b + 1 + n);
int sum = 0;
map<int,int > mp;
priority_queue<int > q;
for(int i=1;i<=n;i++) mp[b[i]]++;
for(int i=0;i<=n;i++)
{
a[i] = sum + mp[i];
if(mp[i])
{
while((mp[i]--)>1)
{
q.push(i);
}
}
else
{
if(q.size()==0) break;
sum += i-q.top();
q.pop();
}
}
for(int i=0;i<=n;i++) cout << a[i] << " ";
cout<<endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=2e7+5;
typedef long long ll;
int a[N];
typedef pair<int,int>PII;
int main()
{
int t;cin>>t;
while(t–)
{
int n;cin>>n;
map<ll,ll>mp;
for(int i=0;i<n;i++) cin>>a[i],mp[a[i]]++;
ll sum=0,ch=0;
if(!mp[0]) {
cout<<"0 “;
for(int i=1;i<=n;i++) cout<<”-1 “;
cout<<endl;
continue;
}
int flag=1;
cout<<mp[0]<<” “;
mp[0]–;
priority_queue q;
if(mp[0]!=0) q.push({0,mp[0]});
for(int i=1;i<=n;i++)
{
if(flag==0) cout<<”-1 “;
else if(mp[i]==0)
{
cout<<ch<<’ ';
if(q.size()!=0)
{
auto t = q.top() ;
q.pop();
ll x=t.first,y=t.second;
ch+=i-x;
y–;
if(y!=0) q.push({x,y});
}
else flag=0;
}
else
{
cout<<ch+mp[i]<<” ";
mp[i]–;
if(mp[i]) q.push({i,mp[i] } );
}
}
cout<<endl;
}
return 0;
}