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
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
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
Fișierul output.txt va avea următoarea structură:
- Dacă
p = 1se va scrie în fișier, pe prima linie, numărul maxim de puncte care au aceeași abscisă (cerința 1). - Dacă
p = 2se 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
3 ≤ N ≤ 100 000
Exemplul 1
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
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
input.txt:
2
9999999999999
2 1
1 4
3 4
3 2
6 4
Output:
Input-ul nu convine conditiilor
Rezolvare
<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>