CF 367C Sereja y la disposición de los números

https://codeforces.com/problemset/problem/367/C

Titulo

Tienes m números, y cada número tiene un número infinito. Vas a usar estos números para formar una matriz de longitud n. Solicitud

  1. Si se selecciona el número xy el número y, los dos números son adyacentes en al menos una posición en la matriz: hay i, de modo que a [i] = x y a [i + 1] = y, o a [i] = y y a [i + 1] = x

El valor de una matriz está determinado por el valor de los números que componen la matriz. El valor del i-ésimo número es v [i]

El valor de la matriz vacía es 0, considere i de 1 a m, si aparece el i-ésimo número, el valor de la matriz será + v [i]

Pregunte cómo formar una matriz para maximizar el valor de la matriz.

$ 1 \ leqslant n \ leqslant 2 \ times10 ^ 6, 1 \ leqslant m \ leqslant 10 ^ 5 $

$ 1 \ leqslant v_i \ leqslant 10 ^ 5 $

Solución

Dibuje los números seleccionados en un gráfico, todos los números deben conectar dos bordes uno por dos, y el problema es cómo caminar todos los bordes con el menor número de pasos

Entonces se convierte en la pregunta de Euler

Las condiciones necesarias y suficientes para formar el camino de Euler son: hay como máximo dos puntos con grados impares, y el resto son puntos con grados pares

La condición necesaria y suficiente para formar un bucle de Euler es que todos los puntos son puntos con grados pares

Si la carretera de Euler o el circuito de Euler no se pueden formar, necesitamos agregar algunos bordes, porque el problema no requiere que solo aparezcan números adyacentes una vez, y finalmente una secuencia

El número de aristas formadas por n números es

\ [\ frac {n \ cdot (n-1)} {2} \]

El grado de cada punto es $ n-1 $

Si n es impar, se puede formar un bucle de Euler, la longitud de la matriz es igual al número de aristas

Si n es par, el grado de todos los puntos es impar. Cuando n> 2, debe agregar $ \ frac {n} {2} -1 $ bordes, de modo que el grado de $ n-2 $ puntos se convierta en +1, se convierta en Número par, agregue 0 aristas cuando n = 2 para formar el camino de Euler

Esta es definitivamente la matriz de longitud más pequeña que cumple con los requisitos. Si hay una menos, es imposible atravesar todos los bordes. Si hay una más, no debe ser la longitud más pequeña

Entonces puedes obtener el mayor número con $ O (m) $ y luego codicioso para sumar

Complejidad de tiempo $ \ mathcal {O} (m \ log m) $

Código AC

#include <cstdio> 
#include <cstring> 
#include <cmath> 
#include <algorithm> 
#define REP (i, a, b) for (int i = (a); i <(b); i ++) 
#define REPE (i, a, b) para (int i = (a); i <= (b); i ++) 
#define PERE (i, a, b) for (int i = (a); i> = (b) ; i--) 
usando el espacio de nombres estándar ; 
typedef largo largo ll; 
#define MAXM 100007 
int arr [MAXM]; 
inline bool cmp (int a, int b) {return a> b;} 
int main () { 
	int n, m; scanf ("% d% d", & n, & m); 
	REP (i, 0, m) scanf ("% * d% d", & arr [i]); 
	ordenar (arr, arr + m, cmp); 
	int ch = -1; ll ans = 0; 
	PERE (x, m, 1) { 
		ll t = ll (x) * (x-1) / 2; 
		if ((x & 1) == 0) t + = x / 2-1; 
		if (t <n) {ch = x; descanso;
	REP (i, 0, ch) ans + = arr [i]; 
	printf ("% lld \ n", ans); 
}

 

Supongo que te gusta

Origin www.cnblogs.com/sahdsg/p/12722442.html
Recomendado
Clasificación