修改数组--蓝桥杯
思想:并查集
注意:有2个地方要用到 并查集 不然会时间超时;
代码:(可能有错误)
#includeusing 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; }
注意: 数组开的大小。