Codeforces Ronda # 628 (Div. 2)

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 ;
}

E, F será actualizado en marzo después de una parte del título refundido de la formación se completa.

Supongo que te gusta

Origin www.cnblogs.com/HarryHuang2004/p/12498635.html
Recomendado
Clasificación