/******************************************************************************************************
** Copyright (C) 2011.07.01-2013.07.01
** Author: famousDT <13730828587@163.com>
** Edit date: 2011-12-08
******************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>//abs,atof(string to float),atoi,atol,atoll
#include <math.h>//atan,acos,asin,atan2(a,b)(a/b atan),ceil,floor,cos,exp(x)(e^x),fabs,log(for E),log10
#include <vector>
#include <queue>
#include <map>
#include <time.h>
#include <set>
#include <list>
#include <stack>
#include <string>
#include <iostream>
#include <fstream>
#include <assert.h>
#include <bitset>
#include <iterator>//C++Primer
#include <string.h>//memcpy(to,from,count
#include <ctype.h>//character process:isalpha,isdigit,islower,tolower,isblank,iscntrl,isprll
#include <numeric>
#include <functional>
#include <algorithm>
using namespace std;
typedef long long int ll;
#define MY_PI acos(-1)
#define MY_MAX(a, b) ((a) > (b) ? (a) : (b))
#define MY_MIN(a, b) ((a) < (b) ? (a) : (b))
#define MY_MALLOC(n, type) ((type *)malloc((n) * sizeof(type)))
#define MY_ABS(a) (((a) >= 0) ? (a) : (-(a)))
#define MY_INT_MAX 0x7fffffff
/*==========================================================*\
|
\*==========================================================*/
int p[200005];
int rank[200005];
void make_set(int x) {
p[x] = x;
rank[x] = 0;
}
int find_set(int x) {
if (x != p[x])
p[x] = find_set(p[x]);
return p[x];
}
void link(int x, int y) {
if (rank[x] > rank[y]) p[y] = x;
else {
p[x] = y;
if (rank[x] == rank[y])
rank[y]++;
}
}
void union_set(int x, int y) {
link(find_set(x), find_set(y));
}
int ans[200005];
int main()
{
int n;
while (scanf("%d", &n) == 1 && n) {
memset(ans, 0, sizeof(ans));
int i, x, index;
for (i = 1; i <= 2 * n + 1; ++i) make_set(i);
for (i = 1; i <= n; ++i) {
scanf("%d", &x);
index = find_set(x);
ans[index] = i;
p[index] = index + 1;
}
for (i = 2 * n + 1; i >= 1; --i)
if (ans[i])
break;
printf("%d\n", i);
for (index = 1; index < i; ++index)
printf("%d ", ans[index]);
printf("%d\n", ans[i]);
}
return 0;
}
SOJ-1953(填充数组,并查集)
最新推荐文章于 2022-10-02 19:52:10 发布