修改数组--蓝桥杯

思想:并查集

注意:有2个地方要用到 并查集 不然会时间超时;

代码:(可能有错误)

#include <bits/stdc++.h>
using namespace std;
#define ri register int
#define M 2000005
///// attention M
int n;
int flag[M];
int fa[M];
int p[M];

int find(int a)
{
    if(!flag[a]) {
        return a;
    }
    if(fa[a]) fa[a]=find(fa[a]);
    else 
    fa[a]=find(a+1);
    return fa[a];
    
}
int read()
{
    int x=0,f=1;
    char ch;
    while(ch<'0'||ch>'9')  {if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return f*x;
}

int find2(int a)
{
    
           int b=a;
            if(!fa[a])
           {
             find(a);
             flag[fa[a]]=1;
             fa[b]=fa[a];
             return fa[b];
           }                         
           else{
             a=fa[a]+1;
             if(!flag[a])
             {
              fa[b]=a;
              flag[a]=1;
              return fa[b];
             }
             fa[b]=find2(a);
             return fa[b];
          }  
        
} 
int main(){
    
    scanf("%d",&n);
    for(ri i=1;i<=n;i++)
    p[i]=read();
    
    flag[p[1]]=1;
    
    for(ri i=2;i<=n;i++)
    {
        if(!flag[p[i]])
        {
            flag[p[i]]=1;
            continue;
        }
         int a=p[i];
         fa[a]=find2(a); 
         p[i]=fa[a];
    }
    for(ri i=1;i<=n;i++)
    printf("%d ",p[i]);
    return 0;
    
}
 
View Code

注意: 数组开的大小。

posted @ 2021-11-27 20:36  VxiaohuanV  阅读(50)  评论(0编辑  收藏  举报