Enlace: https://codeforces.com/contest/765/problem/D
Significado de la pregunta; da n números, respectivamente f (i), te permite encontrar n g (i) ym (arbitrario) h (i),
Entre ellos, g (h (x)) = x, h (g (x)) = f (x);
Solución: presione esta fórmula, puede obtener h (x) = f (h (x)), g (x) = g (f (x));
Por lo tanto, se deduce que f (x) = f (f (x)); determine si la función h existe, y la función h es la deduplicación de la función f;
código:
1 #include <bits / stdc ++. H> 2 usando el espacio de nombres std; 3 const int maxn = 1e5 + 10 ; 4 int a [maxn], b [maxn], c [maxn]; 5 int n, m; 6 mapa < int , int > mp; 7 int main () 8 { 9 scanf ( " % d " , & n); 10 para ( int i = 1 ; i <= n; i ++) cin >> a [i]; 11 para ( inti = 1 ; i <= n; i ++ ) 12 { 13 if (a [a [i]]! = a [i]) 14 { 15 cout << " -1 \ n " ; 16 devuelve 0 ; 17 } 18 } 19 para ( int i = 1 ; i <= n; i ++ ) 20 { 21 if (mp [a [i]] == 0 ) 22 { 23 m ++ ; 24 mp [a [i]] =metro; 25 c [m] = a [i]; 26 } 27 b [i] = mp [a [i]]; 28 } 29 cout << m << endl; 30 para ( int i = 1 ; i <= n; i ++ ) 31 cout << b [i] << " " ; 32 cout << endl; 33 para ( int i = 1 ; i <= m; i ++ ) 34 cout << c [i] << " " ; 35 cout << endl; // sistema ("pausa"); 37 devuelve 0 ; 38 }