题意为给定一个长度为 \(n\) 的序列 \(b\),要求你构造一个序列 \(a\) 使得对于每一个序列 \(a\) 中的数 \(a_i\),在序列 \(a\) 都出现了 \(b_i\) 次。
可以发现 \(a\) 序列中的数的大小是无关紧要的,重要的是出现次数。
一开始可以很快的得出一个错解那就是判断完有无解之后直接输出 \(b\) 序列。
但是这个解法的错误在于可能有多个相同出现次数的 \(a_i\),即 \(b_i\) 在 \(b\) 中的出现次数应为其倍数而不是其本身。
所以用一个变量 \(cnt\) 来代表现在用了多少个数来构建 \(a_i\),再对于每\(b_i\)次都让 \(cnt\) 增加一次,此时每个 \(a_i\) 即为 \(cnt\)。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int t,n,a[200001],b[200001],cnt,id[200001];
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>t;while(t--){memset(b,0,sizeof b);memset(id,0,sizeof id);cin>>n,cnt=0;for(int i=1;i<=n;i++)cin>>a[i],b[a[i]]++;bool f=1;for(int i=1;i<=n;i++)if(b[a[i]]%a[i]){f=0;break;}if(!f){cout<<"-1\n";continue;}for(int i=1;i<=n;i++){if(b[a[i]]%a[i]==0)id[a[i]]=(++cnt);cout<<id[a[i]]<<' ';b[a[i]]--;}cout<<'\n';}
}