Tâche
Vous recevrez un ensemble de cercles dans le plan avec leurs centres sur la ligne y = 0 . Il est garanti qu'aucune paire de cercles n'a plus d'un point commun.
Votre tâche consiste à déterminer le nombre de régions dans lesquelles les cercles divisent le plan. Une région est un ensemble de points contigus à inclusion maximale ne coupant aucun des cercles.
Vous devez écrire un programme qui calcule cette réponse lorsque vous recevez une description des cercles.
Voici un exemple:
Sur le côté gauche, vous voyez les cercles dessinés dans l'avion. Cependant, dans la moitié droite de l'image, les régions produites par les cercles sont colorées distinctement (une couleur par région). Il y a six régions dans cet exemple.
Contribution
La première ligne de l'entrée contient un nombre N
, le nombre de descriptions de cercle à suivre. Cette ligne est facultative, si votre solution fonctionne sans elle, c'est très bien.
Les N
lignes suivantes contiennent chacune deux entiers, x i et r i > 0 , représentant un cercle de centre (x i , 0) et de rayon r i .
Il est garanti qu'aucune paire de cercles n'a plus d'un point commun. Il est en outre garanti que x i et r i ne dépassent pas 10^9
en valeur absolue (ils s'intègrent donc confortablement dans un entier 32 bits).
L'entrée peut être:
lire de STDIN
lire à partir d'un fichier nommé
I
dans le répertoire courant
Alternativement, l'entrée pourrait être:
disponible sous forme de chaîne (y compris les sauts de ligne) dans une variable globale
sur la pile
Sortie
Il doit s'agir d'un seul entier, le nombre de régions produites. Cela doit être écrit dans STDOUT ou dans un fichier nommé O
dans le répertoire courant.
Règles
Le code le plus court en octets gagne
+200 octets de pénalité si votre code n'a pas de polynôme d'exécution + complexité spatiale dans
n
Bonus de -100 octets pour le pire cas d'exécution attendu + complexité de l'espace
O(n log n)
Bonus de -50 octets pour le pire cas d'exécution attendu + complexité de l'espace
O(n)
Bonus de -100 octets pour une exécution déterministe + complexité de l'espace
O(n)
Lors de l'évaluation de l'exécution:
Supposons que les tables de hachage aient un
O(1)
temps d'exécution prévu pour l'insertion, la suppression et la recherche, quelle que soit la séquence d'opérations et les données d'entrée. Cela peut être vrai ou non, selon que l'implémentation utilise la randomisation.Supposons que le tri intégré de votre langage de programmation prenne un
O(n log n)
temps déterministe , oùn
est la taille de la séquence d'entrée.Supposons que les opérations arithmétiques sur les nombres saisis ne prennent que du
O(1)
temps.Ne présumez pas que les nombres saisis sont liés par une constante, bien que, pour des raisons pratiques, ils le soient. Cela signifie que les algorithmes comme le tri par radix ou le tri par comptage ne sont pas du temps linéaire. En général, les très grands facteurs constants doivent être évités.
Exemples
Contribution:
2
1 3
5 1
Sortie: 3
Contribution:
3
2 2
1 1
3 1
Sortie: 5
4
7 5
-9 11
11 9
0 20
Contribution:
9
38 14
-60 40
73 19
0 100
98 2
-15 5
39 15
-38 62
94 2
Sortie: 11
Astuces
Nous pouvons utiliser l'idée suivante pour une solution très compacte. Permet d'intersecter l'ensemble des cercles avec l'axe X et d'interpréter les points d'intersection comme des nœuds dans un graphique plan:
Chaque cercle produit exactement 2 arêtes dans ce graphique et jusqu'à deux nœuds. Nous pouvons compter le nombre de nœuds en utilisant une table de hachage pour garder une trace du nombre total de bordures gauche ou droite distinctes.
Ensuite, nous pouvons utiliser la formule caractéristique d'Euler pour calculer le nombre de faces d'un dessin du graphique:
V - E + F - C = 1
F = E - V + C + 1
Pour calculer C
le nombre de composants connectés, nous pouvons utiliser une recherche en profondeur d'abord .
Remarque: Cette idée de problème est empruntée à un récent concours de programmation croate , mais ne trichez pas en regardant les contours de la solution. :)
n log n
bonus? De plus, j'ai une nouvelle solution conceptuellement nouvelle. Dois-je poster une nouvelle réponse ou remplacer l'ancienne? (Je préférerais l'ancien, au cas où ma nouvelle solution ne serait pas vraiment correcte)