fbpx

Problema #2970 – paralele1 – Rezolvari PBInfo

de Mihai-Alexandru

Avem o matrice de dimensiuni N x M, cu elemente 0 și 1. Numim segment o secvență de cel puțin două valori 1 aflate una lângă alta, toate pe aceeași linie, sau toate pe aceeași coloană a matricei.

Cerința

Se cere determinarea numărului de perechi de segmente:

Exemplu

paralele.in

1 5 6
0 1 1 1 0 0
1 0 0 0 0 0
0 0 0 1 0 0
1 1 0 1 1 0
0 1 1 0 0 0

paralele.out

11

Explicație

Prima valoare din fișierul de intrare fiind 1, ne interesează segmente formate pe linii. Pe prima linie este o secvență de valori 1 formată din trei elemente. Ea produce trei segmente: cel cu primele două valori de 1, cel cu ultimele două valori de 1 și cel cu toate cele trei valori de 1. Pe linia a doua nu se găsește niciun segment, nefiind cel puțin două valori 1 alăturate. Pe linia a treia nu se găsește niciun segment, pe linia a patra sunt două segmente iar pe linia a cincea este un singur segment. Numărul cerut se obține astfel: fiecare dintre cele trei segmente de pe prima linie este paralel cu fiecare dintre segmentele de pe a patra și de pe a cincea linie iar segmentele de pe linia a patra sunt paralele cu segmentul de pe ultima linie. Pentru exemplul prezentat, dacă am fi avut T = 2 rezultatul calculat ar fi trebuit să fie 1 (segmentul de pe coloana a doua este paralel cu segmentul de pe coloana a patra).

#include <bits/stdc++.h>

using namespace std;

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

int a[501][501] , n , m , cer , x[40001];
int b[40001][11];
long long s;

int main()
{
    cin >> cer >> n >> m;
    if(n <= 500)
    {
        for(int i = 1 ; i <= n ; i++)
            for(int j = 1 ; j <= m ; j++)
                cin >> a[i][j];
        if(cer == 1)
        {
                for(int i = 1 ; i <= n ; i++)
                {
                    int l = 0;
                    for(int j = 1 ; j <= m ; j++)
                        if(a[i][j] == 1) l++;
                        else
                        {
                            x[i] += l*(l - 1) / 2;
                            l = 0;
                        }
                    x[i] += l*(l - 1) / 2;
                }
                for(int i = 1 ; i <= n ; i++)
                    for(int j = i + 1 ; j <= n ; j++)
                        s += 1ll * x[i] * x[j];
                cout << s;

        }
        else
        {
            for(int i = 1 ; i <= m ; i++)
            {
                int l = 0;
                for(int j = 1 ; j <= n ; j++)
                    if(a[j][i] == 1) l++;
                    else
                    {
                        x[i] += l*(l - 1) / 2;
                        l = 0;
                    }
                x[i] += l*(l - 1) / 2;
            }
            for(int i = 1 ; i <= m ; i++)
                for(int j = i + 1 ; j <= m ; j++)
                    s += 1ll * x[i] * x[j];
            cout << s;

        }
    }
    else
    {
        for(int i = 1 ; i <= n ; i++)
            for(int j = 1 ; j <= m ; j++)
                cin >> b[i][j];
        for(int i = 1 ; i <= n ; i++)
                {
                    int l = 0;
                    for(int j = 1 ; j <= m ; j++)
                        if(b[i][j] == 1) l++;
                        else
                        {
                            x[i] += l*(l - 1) / 2;
                            l = 0;
                        }
                    x[i] += l*(l - 1) / 2;
                }
        for(int i = 1 ; i <= n ; i++)
            s += x[i];
        s = s * (s - 1) / 2;
        for(int i = 1 ; i <= n ; i++)
            s -= 1ll * x[i] * (x[i] - 1) / 2;
        cout << s;
    }
    return 0;
}
Comentarii

S-ar putea sa iti placa