2071 - Triunghiuri2

De la Universitas MediaWiki

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 = 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 la 1 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

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")