Cod sursa(job #3158261)

Utilizator SSKMFSS KMF SSKMF Data 18 octombrie 2023 10:46:05
Problema Trapez Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream cin ("trapez.in");
ofstream cout ("trapez.out");

int main ()
{
    int numar_puncte;
    cin >> numar_puncte;

    pair <int , int> coordonate[1000];
    for (int indice = 0 ; indice < numar_puncte ; indice++)
        cin >> coordonate[indice].first >> coordonate[indice].second;

    for (int indice_1 = 0 ; indice_1 < numar_puncte ; indice_1++)
        for (int indice_2 = indice_1 + 1 ; indice_2 < numar_puncte ; indice_2++)
            if (coordonate[indice_1].first > coordonate[indice_2].first)
                swap(coordonate[indice_1] , coordonate[indice_2]);

    long long optiuni[1001] = {0} , total = 0;
    for (int indice = 0 ; indice < numar_puncte ; indice++)
    {
        int lungime_secventa = 1;
        while (indice < numar_puncte - 1 && coordonate[indice + 1].first == coordonate[indice].first)
            { indice++; lungime_secventa++; }

        if (lungime_secventa > 1)
            total += (optiuni[++optiuni[0]] = lungime_secventa * (lungime_secventa - 1) / 2);
    }

    long long modalitati = 0;
    for (int indice = 1 ; indice <= optiuni[0] ; indice++)
        modalitati += optiuni[indice] * (total -= optiuni[indice]);

    for (int indice_1 = 0 ; indice_1 < numar_puncte ; indice_1++)
        for (int indice_2 = indice_1 + 1 ; indice_2 < numar_puncte ; indice_2++)
            if (coordonate[indice_1].second > coordonate[indice_2].second)
                swap(coordonate[indice_1] , coordonate[indice_2]);

    optiuni[0] = {0};
    for (int indice = 0 ; indice < numar_puncte ; indice++)
    {
        int lungime_secventa = 1;
        while (indice < numar_puncte - 1 && coordonate[indice + 1].second == coordonate[indice].second)
            { indice++; lungime_secventa++; }

        if (lungime_secventa > 1)
            total += (optiuni[++optiuni[0]] = lungime_secventa * (lungime_secventa - 1) / 2);
    }

    for (int indice = 1 ; indice <= optiuni[0] ; indice++)
        modalitati += optiuni[indice] * (total -= optiuni[indice]);

    cout << modalitati;
    cout.close(); cin.close();
    return 0;
}