AcWing 1242. 修改数组
原题链接
中等
作者:
术
,
2021-03-31 15:13:58
,
所有人可见
,
阅读 334
1. set做法,超时
#include <iostream>
#include <set>
using namespace std;
const int N=1e5+5;
int n;
int a[N];
set<int> st;
//找未出现最小整数
int fun(int i)
{
set<int>::iterator it=st.begin();
int k=a[i];
while(st.find(k)!=st.end())
{
k++;
}
st.insert(k);
a[i]=k;
}
int main()
{
cin>>n;
for(int i=0; i<n; i++)
cin>>a[i];
st.insert(a[0]);
for(int i=1;i<n;i++){
fun(i);
}
for(int i=0;i<n;i++) cout<<a[i]<<" ";
//cout << "Hello world!" << endl;
return 0;
}
2.并查集
#include <iostream>
using namespace std;
const int N=1e6+5;
int n;
int p[N];
//并查集,将相等的数看作属于一个集合
int fin(int x)
{
if(x!=p[x])
p[x]=fin(p[x]);
return p[x];
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=N;i++) p[i]=i;//第一次出现,父节点是本身
for(int i=0;i<n;i++){
int x;
cin>>x;
x=fin(x);
cout<<x<<" ";
p[x]=x+1;//每有一个相同的数,集合父节点加1
}
return 0;
}