是看不出用并查集能解决问题。
就像单链表一样,初始所有的点指向自己,表示没用过,否则指向下一个点(+1),很巧妙的算法
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(System.out);
static int N = 1100000 + 10;
static int n, p[] = new int[N];
public static void main(String[] args) throws IOException {
n = Integer.parseInt(br.readLine());
String s[] = br.readLine().split(" ");
for (int i = 1; i <= n; i++) p[i] = i;
for (int i = 1; i <= n; i++) {
int x = Integer.parseInt(s[i - 1]);
x = find(x);
pw.print(x + " ");
p[x] = x + 1;
}
pw.flush();
pw.close();
br.close();
}
public static int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
}