fbpx

Problema #1323 – Matrice_Rara – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se citesc două matrice rare și se cere să se calculeze suma lor.

O matrice A(n,m) se numește rară dacă majoritatea elementelor sale sunt egale cu zero (cel puţin jumătate). Datorită numărului mic de numere nenule, o matrice rară A(n,m), având k elemente nenule, poate fi memorată folosind un șir X conţinând k triplete de forma (linie, coloană , valoare), corespunzătoare valorilor nenule ale matricei. Elementele șirului X se memorează în ordine lexicografică după (linie,coloana).

De exemplu matricea cu n = m = 3

1 0 2
0 0 5
0 2 0

se va memora sub forma sirului X continand 4 triplete : {(1,1,1) , (1,3,2) , (2,3,5) , (3,2,2)}.

Date de intrare

Fișierul de intrare matrice_rara.in conține pe prima linie , dimensiunile celor două matrice n m – reprezentând numărul de linii şi coloane, şi N1 N2, numărul de elemente nenule ale matricei A, respectiv matricei B. Apoi următoarele N1 linii vor conține triplete – elementele nenule ale matricei A în ordine lexicografică, iar ultimele N2 linii vor conține triplete reprezentând elementele nenule ale matricei B, tot în ordine lexicografică .

Date de ieșire

Fișierul de ieșire matrice_rara.out va conține pe prima linie numărul de elemente diferite de 0 din matricea sumă C şi apoi matricea în sine sub forma tripletelor în ordine lexicografică, câte unul pe o linie .

Restricții și precizări

  • 1 ≤ n , m ≤ 1.000.000
  • 1 ≤ N1 , N2 ≤ 300.000
  • -1.000.000.000 ≤ A[i][j], B [i][j]≤ 1.000.000.000

Exemplu

matrice_rara.in

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

matrice_rara.out

4
1 1 2
1 2 3
3 4 1
4 6 3
#include <bits/stdc++.h>
using namespace std;

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

struct andra
{
    int i , j , val;
};
andra a[300001] , c[300001] , b[300001];

void citire(andra a[] , int n)
{
    for(int i = 1 ; i <= n ; i++)
        cin >> a[i].i >> a[i].j >> a[i].val;
}

void afisare(andra a[] , int n)
{
    cout << n << '\n';
    for(int i = 1 ; i <= n ; i++)
        cout << a[i].i << " " << a[i].j << " " << a[i].val << '\n';
}

int maimic(andra a , andra b)
{
    return a.i < b.i || a.i == b.i && a.j < b.j;
}

long long  n , m , nc , n1 , n2;

int main()
{
    cin >> n >> m >> n1 >> n2;
    citire(a , n1);
    citire(b , n2);
    int i = 1 , j = 1;
    while(i <= n1 && j <= n2)
    {
        if(maimic(a[i] , b[j])) c[++nc] = a[i++];
        else if(maimic(b[j] , a[i])) c[++nc] = b[j++];
        else
        {
            if(a[i].val + b[j].val != 0)
            {
                c[++nc] = a[i];
                c[nc].val += b[j].val;
            }
            i++;
            j++;
        }
    }
    while(i <= n1) c[++nc] = a[i++];
    while(j <= n2) c[++nc] = b[j++];
    cout << nc << '\n';
    for(int i = 1 ; i <= nc ; i++)
        cout << c[i].i << " " << c[i].j << " " << c[i].val << '\n';
}
Comentarii

S-ar putea sa iti placa