这道题目可以直接暴力,可以过7个数据;
但是我们也可以利用并查集进行一个优化,思想如下
1:刚开始所有节点的祖宗节点都是自己;
2:输入一个数 x 的时候我们搜索 x 的祖宗节点 p,并输出这个祖宗节点的下标 p ;
3:将 祖宗节点指向p+1;
具体的图像如下;
所以我们又找到一个并查集的作用:用o(1)的时间复杂度检测前面是否出现满足条件的区间
#include<iostream>
using namespace std;
const int N=1000010;
int p[N];
int find(int x){
if(p[x]!=x) p[x]=find(p[x]);
else return x;
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=N;i++) p[i]=i;
while(n--){
int x; cin>>x;
x=find(x);
cout<<x<<' ';
p[x]=x+1;
}
}