2071 - Triunghiuri2
Se consideră N
puncte din plan, având coordonate numere naturale, relativ la un reper cartezian XOY
, oricare două puncte fiind distincte.
Cerința[edit | edit source]
Cunoscând N
și coordonatele celor N
puncte, să se determine:
1) Numărul maxim de puncte care au aceeași abscisă.
2) Numărul triunghiurilor care se pot desena respectând următoarele condiții:
- au toate vârfurile în puncte dintre cele date;
- au o latură paralelă cu
OX
; - nu au laturi paralele cu
OY
;
Date de intrare[edit | edit source]
Fișierul de intrare input.txt
conține pe prima linie numărul p
, care indică cerința ce trebuie rezolvată (p
are valoarea 1
sau 2
). Pe a doua linie se află numărul natural N
, reprezentând numărul punctelor date. Pe următoarele N
linii se găsesc câte două valori naturale x y
, separate prin câte un spațiu, reprezentând coordonatele punctelor date.
Date de ieșire[edit | edit source]
Fișierul output.txt
va avea următoarea structură:
- Dacă
p = 1
se va scrie în fișier, pe prima linie, numărul maxim de puncte care au aceeași abscisă (cerința 1). - Dacă
p = 2
se va scrie în fișier, pe prima linie, numărul triunghiurilor care se pot desena respectând condițiile date,modulo 1.000.003
, adică restul împărțirii numărului de triunghiuri la1 000 003
(cerința 2).
Restricții și precizări[edit | edit source]
3 ≤ N ≤ 100 000
Exemplul 1[edit | edit source]
input.txt:
1
5
2 1
1 4
3 4
3 2
6 4
output.txt:
2
Explicație:
Se rezolvă cerința 1). Sunt maximum două puncte care au aceeași abscisă: (3, 4)
și (3,2)
.
Exemplul 2[edit | edit source]
input.txt:
2
5
2 1
1 4
3 4
3 2
6 4
output.txt:
4
Explicație:
Se rezolvă cerința 2). Se pot trasa 4
triunghiuri care satisfac cerințele. Dacă notăm cele 5
puncte din fișier cu A
, B
, C
, D
, E
(ca în imagine), atunci, cele 4
triunghiuri care satisfac cerințele sunt : ABC
, ACE
, ABE
și BDE
.
Exemplul 3[edit | edit source]
input.txt:
2
9999999999999
2 1
1 4
3 4
3 2
6 4
Output:
Input-ul nu convine conditiilor
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def verificare(n):
if not(3<=n<=100000): print("Input-ul nu convine conditiilor") exit()
- Define constants
Nmax = 100001 # numarul maxim de puncte Cmax = 1001 # coordonata maxima IN = "input.txt" OU = "output.txt"
N = 0 # numarul punctelor NrTr = 0 # numarul triunghiurilor gasite
nx = [0] * Cmax # nx[i] - cate puncte sunt pe absisa i ny = [0] * Cmax # ny[i] - cate puncte sunt pe ordonata i H = [[0] * Cmax for _ in range(Cmax)] # memorez punctele ordonate H[i] - lista punctelor cu ordonata i
- citire date
with open(IN, "r") as Fin:
V = int(Fin.readline()) N = int(Fin.readline()) verificare(N) for i in range(Cmax): nx[i] = ny[i] = 0 for _ in range(N): x, y = map(int, Fin.readline().split()) nx[x] += 1 ny[y] += 1 H[y][ny[y]] = x
if V == 1:
Max = max(nx[:1000]) with open(OU, "w") as Fou: Fou.write(f"{Max}\n")
else:
NrTr = 0 for i in range(Cmax - 1): if ny[i] > 1: sumLin = 0 for j in range(1, ny[i] + 1): sumLin += (nx[H[i][j]] - 1) * (ny[i] - 1) aux1 = (ny[i] * (ny[i] - 1) // 2) aux2 = (N - ny[i]) aux = aux1 * aux2 NrTr += aux - sumLin NrTr %= 1000003
with open(OU, "w") as Fou: Fou.write(f"{NrTr}\n")
</syntaxhighlight>