3788 - Matricea

De la Universitas MediaWiki

Enunț

Se consideră o matrice binară B (cu valori 0 sau 1) cu N linii şi M coloane, liniile şi coloanele fiind numerotate de la 1 la N, respectiv de la 1 la M. Matricea B este generată după regula B[i][j] = R[i] xor C[j], unde R şi C sunt vectori binari de lungime N, respectiv M. Numim dreptunghi de colţuri (x1,y1) (x2,y2) cu x1 ≤ x2 şi y1 ≤ y2, mulţimea elementelor B[i][j] cu x1 ≤ i ≤ x2 și y1 ≤ j ≤ y2. Aria unui astfel de dreptunghi este (x2 - x1 + 1) * (y2 - y1 + 1).

Cerința

Determinaţi numărul maxim de elemente egale cu 0 într-un dreptunghi a cărui arie este exact A, precum şi numărul de dreptunghiuri pentru care se obţine acest număr maxim.

Date de intrare

Fișierul de intrare matricein.txt conține pe prima linie pe prima linie numerele naturale N, M, A separate prin câte un spaţiu. A doua linie va conţine N valori 0 sau 1 separate prin câte un spaţiu, reprezentând elementele vectorului R, iar a treia linie va conţine M valori 0 sau 1 separate prin câte un spaţiu, reprezentând elementele vectorului C.

Date de ieșire

Fișierul de ieșire matriceout.txt va conține o singură linie pe care vor fi scrise două numere naturale separate printr-un singur spaţiu Zmax Nsol, reprezentând în ordine numărul maxim de elemente egale cu 0 într-un dreptunghi a cărui arie este exact A, precum şi numărul de dreptunghiuri pentru care se obţine acest număr maxim.

Restricții și precizări

  • 1 ⩽ N, M ⩽ 30.000
  • 1 ⩽ A ⩽ 5.000.000
  • Prin xor se înţelege operatorul sau exclusiv (^ în C++). Mai exact: x ^ y = 1 dacă și numai dacă un operand este 0, iar celălalt 1, deci 0 ^ 0 = 0, 1 ^ 1 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1.

Exemplul 1

Intrare
matricein.txt
2 4 4
0 1
1 0 0 1
Ieșire
Datele de intrare corespund restricțiilor impuse
matriceout.txt
2 5

Explicație

Matricea B este:

1 0 0 1
0 1 1 0

Numărul maxim de valori 0 dintr-un dreptunghi de arie 4 este 2. Cele 5 dreptunghiuri de arie 4 cu număr maxim de 0 sunt:

(1,1) (1,4)
(2,1) (2,4)
(1,1) (2,2)
(1,2) (2,3)
(1,3) (2,4)

Exemplul 2

Intrare
matricein.txt
30001 4 4
0 1
1 0 0 1
Ieșire
Datele de intrare NU corespund restricțiilor impuse

Rezolvare

#3788 - Matricea

def validare_date(n, m, a, r, c):
    if not (1 <= n <= 30000) or not (1 <= m <= 30000) or not (1 <= a <= 5000000):
        return False
    if len(r) != n or len(c) != m:
        return False
    if not all(bit in {0, 1} for bit in r) or not all(bit in {0, 1} for bit in c):
        return False
    return True


def rezolva_problema(n, m, a, r, c):
    if validare_date(n, m, a, r, c):
        print("Datele de intrare corespund restricțiilor impuse")
        matrice = [[0] * m for _ in range(n)]

        for i in range(n):
            for j in range(m):
                matrice[i][j] = r[i] ^ c[j]

        max_zeros = 0
        numar_dreptunghiuri = 0

        for x1 in range(n):
            for y1 in range(m):
                for x2 in range(x1, n):
                    for y2 in range(y1, m):
                        arie = (x2 - x1 + 1) * (y2 - y1 + 1)
                        if arie == a:
                            num_zeros = sum(matrice[i][j] == 0 for i in range(x1, x2 + 1) for j in range(y1, y2 + 1))
                            if num_zeros > max_zeros:
                                max_zeros = num_zeros
                                numar_dreptunghiuri = 1
                            elif num_zeros == max_zeros:
                                numar_dreptunghiuri += 1

        with open("matriceout.txt", "w") as f_out:
            f_out.write(f"{max_zeros} {numar_dreptunghiuri}\n")
    else:
        print("Datele de intrare NU corespund restricțiilor impuse")
        exit(0)


with open("matricein.txt", "r") as f:
    n, m, a = map(int, f.readline().split())
    r = list(map(int, f.readline().split()))
    c = list(map(int, f.readline().split()))

rezolva_problema(n, m, a, r, c)