Parece que el primer capítulo de explicaciones no hacen goo
Problema A.
El significado de los problemas
Dado un número x, configuración requiere dos números enteros positivos a, b, de tal manera que gcd (a, b) + lcm (a, b) = x. (X <= 1e9)
solución
Construcción simple, a = 1, b = x-1 que cumple con los requisitos de la materia.
código
#include <bits / STDC ++ h.> usando espacio de nombres std; int T, n; int main () { scanf ( " % d " , y T); mientras que (T - ) { scanf ( " % d " , y n); printf ( " % d% d \ n " , 1 , n - 1 ); } Volver 0 ; }
Problema B.
El significado de los problemas
Dado un vector a1, a2, a3, ......, una, los n veces copiados la matriz (es decir, A1, A2, ......, una, a1, a2, ......, una, a1, ......), una matriz de novedad aumento de la longitud de la secuencia más larga.
solución
Análisis, suponiendo que la matriz original excluyendo a cabo número duplicado de m elementos, la longitud de la más larga sub-secuencia no puede elevarse más de m (si m excede sin duda se repite el número de selección, no cumple con el aumento de la secuencia más larga define ). Frente a la parte posterior de la i-ésima matriz tomado gran número de i en la matriz se configura para tener un aumento en el número m de la secuencia más larga.
Por lo tanto, siempre existe la longitud de la secuencia más larga se incrementa en presencia de soluciones m.
código
#include <bits / STDC ++ h.> usando espacio de nombres std; const int N = 1e5 + 5 ; int T, n, a [N]; int main () { scanf ( " % d " , y T); mientras que (T - ) { scanf ( " % d " , y n); mapa < int , bool > pf; int ans = 0 ; para ( int i = 1 ; i <= n; i ++ ) { scanf ( " % d " , & a [i]); si (! mp [a [i]]) ans ++ ; mp [a [i]] = verdadero ; } Printf ( " % d \ n " , ans); } Volver 0 ; }
Problema C.
El significado de los problemas
Lo que se enfrentan a problemas de escritura cosa picante de pollo, se tardó 45 minutos 5min quieren ver las preguntas preguntas escritas 1min 3min Título sintonizar
Dado un árbol superó los n-1 n nodos en la reivindicación 0,1,2, ......, n-2, se define en todos los lados de superíndice MEX (u, v) a excepción de que el árbol u v camino simple a través del árbol para el mínimo de todos los lados excepto los valores lados, tal que para cualquier u, valor máximo MEX (u, v) v es tan pequeño como sea posible.
Explicarlo de nuevo la definición de MEX:
Este es el objeto de una muestra dada en el árbol.
Supongamos que solicitamos MEX (4,6).
camino simple para obtener 4-> 6:
Como puede verse, el camino a través de los tres lados de 2,4, el árbol restante bordes 0,3, el valor mínimo es 0, MEX (4,6) que es 0.
Del mismo modo disponible, MEX (4,3) = 1, MEX (3,6) = 2.
solución
Obviamente, cualquiera de un árbol de un punto a otro en un camino simple no pasa por el mismo punto dos veces, equivalente a no pasar a través de cualquiera de los tres lados conectados al mismo punto.
Puede ser construido de un pequeño árbol de respuesta: buscar un tres o más puntos y conectados por los bordes, para ser conectado a cualquiera de los tres lados del punto asignado a 0,1,2.
Debido 0,1,2 tres lados no pueden existir en un camino simple, por lo que la respuesta es dos. Y debido a que los dos lados de cualquier árbol pueden estar presentes en un camino simple, por lo que la respuesta no puede ser mayor que 2.
Se puede encontrar, esta estructura es óptima.
código
Especial atención a la situación condenado árbol como una cadena.
#include <bits / STDC ++ h.> usando espacio de nombres std; const int N = 1e5 + 5 ; int n, m, eligió, ans [N], Tim, cnt = 3 , Visita [N]; vector < int > g [N]; par < int , int > p [N]; int main () { scanf ( " % d " , y n); para ( int i = 1 ; i <n; i ++ ) { int u, v; scanf ( " % d% d" , Y u, y v); g [u] .push_back (v); g [v] .push_back (u); p [i] .First = u; p [i] .SECOND = v; } para ( int i = 1 ; i <= n; i ++ ) si (g [i] .size ()> = 3 ) { eligió = i; descanso ; } Si (eligió == 0 ) { para ( int i = 1 ; i <n; i ++ ) printf ( "% d \ n " , i - 1 ); retorno 0 ; } para ( int i = 1 ; i <n; i ++ ) si (p [i] == .First eligió || p [i] = .SECOND = elegir) { ans [i] = tim; tim ++ ; visita [i] = 1 ; si (tim> 2 ) descanso ; } para ( int i = 1 ; i <n; i ++ ) si (! visita [i]) American National Standard [i] = cnt ++ ; para ( int i = 1 ; i <n; i ++ ) printf ( " % d \ n " , ans [i]); volver 0 ; }
Problema D.
El significado de los problemas
Configurado como un n matriz de longitud corta de tal manera que el conjunto de todos los elementos y un valor v dado, y el O exclusivo de todos los elementos para un valor dado u.
solución
Tres preguntas sobre la escandalosa construcción **
El primer paso es determinar u, v si solucionable.
Algunos número de XOR y, ciertamente, no es mayor que su suma, no debe ser inferior a v u.
En segundo lugar, si el O exclusivo es 1 y el bit, la matriz, el número de 1 bits deben es impar, y el bit debería ser 1. Del mismo modo, si los OR exclusiva de los bits y es 0, y el bit debe ser cero.
Por lo tanto, si y sólo si v> = u y (Vu) | 2 es el caso en el que, u, v solvencia.
Obviamente, en el caso resolubilidad v u, {u, (vu) / 2, (vu) / 2} es una configuración siempre resoluble, por lo que sólo hay que considerar la Patente frase n <3 casos.
Solvable en el caso de u = v = 0: n = 0.
n = 1: resoluble en el caso de u = v.
n = 2: {/ 2 ( v + u) / 2, (vu)} satisface la condición establecida en el caso. (Las razones específicas para no escribir escribirían en otro blog)
código
#include <bits / STDC ++ h.> usando espacio de nombres std; largo tiempo n, m; int main () { scanf ( " % LLD% LLD " , y n, y m); si (n> m || (m - n)% 2 ! = 0 ) { puts ( " -1 " ); volver 0 ; } Demás si (n == m && n == 0 ) { puts ( " 0 " ); } Demás si (n == m) { printf ( " 1 \ n% LLD " , n); } Más { larga largo x = (n + m) / 2 , y = n; largo tiempo a = x, b = x - y; si ((a + b) == m && (a ^ b) == n) printf ( " 2 \ n% LLD% LLD " , a, b); más printf ( " 3 \ n% LLD% LLD% LLD " , n, (m - n) / 2 , (m - n) / 2 ); volver 0 ; } regreso 0 ; }