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;
}