Rezolvare completă PbInfo #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 triunghiuri2.in 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 triunghiuri2.out 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
  • 0 <= x < 1000
  • 0 <= y < 1000
  • Se acordă 25 puncte pentru rezolvarea corectă a cerinței 1 și 65 puncte pentru rezolvarea corectă a cerinței 2. În concurs s-au acordat 10 puncte din oficiu. Pe site se acordă 10 puncte pentru exemple.

Exemplul 1

triunghiuri2.in

1
5
2 1
1 4
3 4
3 2
6 4

triunghiuri2.out

2

Explicație

Se rezolvă cerința 1). Sunt maximum două puncte care au aceeași abscisă: (3, 4) și (3,2).

Exemplul 2

triunghiuri2.in

2
5
2 1
1 4
3 4
3 2
6 4

triunghiuri2.out

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.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Triunghiuri2:

///sursa oficiala - prof. Alin Burta
#include <fstream>

#define Nmax 100001         //numarul maxim de puncte
#define Cmax 1001           //coordonata maxima
#define IN "triunghiuri2.in"
#define OU "triunghiuri2.out"

using namespace std;

long N;                     //numarul punctelor
long long NrTr;                  //numarul triunghiurilor gasite

short nx[Cmax];             // nx[i] - cate puncte sunt pe absisa i
short ny[Cmax];             // ny[i] - cate puncte sunt pe ordonata i
short H[Cmax][Cmax];        //memorez punctele ordonate  H[i] - lista punctelor cu ordonata i

long long aux, aux1, aux2,  sumLin;

int main()
{
    long int i, j, Max, V;
    short x, y;
    //citire date
    ifstream Fin(IN);
    Fin >> V >> N;
    for(i = 0; i <= Cmax - 1; ++i) nx[i] = ny[i] = 0;
    for(i = 1; i <= N; ++i)
    {
        Fin >> x >> y;
        nx[x]++; ny[y]++;
        H[ y ][ ny[y] ] = x;
    }
    Fin.close();

    if( V == 1)
    {
        Max = 0;
        for(i = 0; i <= 999; ++i)
            if(nx[i] > Max)
                Max = nx[i];
        ofstream Fou(OU);
        Fou << Max << '\n';
        Fou.close();
    }
    else
    {
        NrTr = 0;
        for( i = 0; i< Cmax-1; ++i)
        if(ny[i] > 1)
        {
            sumLin = 0;
            for(j = 1; j<=  ny[i]; ++j) 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;
        }
        ofstream Fou(OU);
        Fou << NrTr << '\n';
        Fou.close();
    }
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2071 Triunghiuri2

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2071 Triunghiuri2 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!