Tarea
Se le dará un conjunto de círculos en el plano con sus centros en la línea y = 0 . Se garantiza que ningún par de círculos tiene más de un punto común.
Su tarea es determinar en cuántas regiones se dividen los círculos en el plano. Una región es un conjunto contiguo de puntos de inclusión máxima que no se cruza con ninguno de los círculos.
Debería escribir un programa que calcule esta respuesta cuando se le dé una descripción de los círculos.
Aquí hay un ejemplo:
En el lado izquierdo ves los círculos dibujados en el avión. Sin embargo, en la mitad derecha de la imagen, las regiones producidas por los círculos tienen un color distinto (un color por región). Hay seis regiones en este ejemplo.
Entrada
La primera línea de la entrada contiene un número N
, el número de descripciones de círculo a seguir. Esta línea es opcional, si su solución funciona sin ella, está bien.
N
Cada una de las siguientes líneas contiene dos enteros, x i y r i > 0 , que representan un círculo con centro (x i , 0) y radio r i .
Se garantiza que ningún par de círculos tiene más de un punto común. Además, se garantiza que x i y r i no exceden 10^9
en valor absoluto (por lo que caben cómodamente en un entero de 32 bits).
La entrada puede ser:
leer de STDIN
leer desde un archivo nombrado
I
en el directorio actual
Alternativamente, la entrada podría ser:
disponible como una cadena (incluidas las nuevas líneas) en una variable global
en la pila
Salida
Debe ser un número entero único, el número de regiones producidas. Esto debe escribirse en STDOUT o en un archivo nombrado O
en el directorio actual.
Reglas
El código más corto en bytes gana
Penalización de +200 bytes si su código no tiene un polinomio de tiempo de ejecución + complejidad espacial en
n
-Bono de 100 bytes para el peor tiempo de ejecución esperado + complejidad espacial
O(n log n)
-50 bono de bonificación para el peor tiempo de ejecución esperado + complejidad espacial
O(n)
-Bono de 100 bytes para tiempo de ejecución determinista + complejidad espacial
O(n)
Mientras evalúa el tiempo de ejecución:
Suponga que las tablas hash tienen
O(1)
tiempo de ejecución esperado para insertar, eliminar y buscar, independientemente de la secuencia de operaciones y los datos de entrada. Esto puede o no ser cierto, dependiendo de si la implementación utiliza la aleatorización.Suponga que el tipo de lenguaje de programación incorporado requiere
O(n log n)
tiempo determinista , donden
está el tamaño de la secuencia de entrada.Suponga que las operaciones aritméticas en números de entrada toman solo
O(1)
tiempo.No asuma que los números de entrada están unidos por una constante, aunque, por razones prácticas, lo están. Esto significa que los algoritmos como la clasificación por radix o la clasificación por conteo no son de tiempo lineal. En general, se deben evitar factores constantes muy grandes.
Ejemplos
Entrada:
2
1 3
5 1
Salida: 3
Entrada:
3
2 2
1 1
3 1
Salida: 5
4
7 5
-9 11
11 9
0 20
Entrada:
9
38 14
-60 40
73 19
0 100
98 2
-15 5
39 15
-38 62
94 2
Salida: 11
Consejos
Podemos usar la siguiente idea para una solución muy compacta. Vamos a intersecar el conjunto de círculos con el eje X e interpretar los puntos de intersección como nodos en un gráfico plano:
Cada círculo produce exactamente 2 aristas en este gráfico y hasta dos nodos. Podemos contar el número de nodos mediante el uso de una tabla hash para realizar un seguimiento del número total de bordes distintos izquierdo o derecho.
Entonces podemos usar la fórmula característica de Euler para calcular el número de caras de un dibujo del gráfico:
V - E + F - C = 1
F = E - V + C + 1
Para calcular C
el número de componentes conectados, podemos usar una búsqueda de profundidad primero .
Nota: Esta idea problemática está tomada de un concurso de programación croata reciente , pero no hagas trampa mirando los esquemas de la solución. :)
n log n
bonificación? Además, tengo una nueva solución conceptualmente nueva. ¿Debo publicar una nueva respuesta de reemplazar la anterior? (Preferiría la primera, en caso de que mi nueva solución no sea realmente correcta)