3788 - Matricea
Enunț[edit | edit source]
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[edit | edit source]
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[edit | edit source]
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[edit | edit source]
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[edit | edit source]
- 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[edit | edit source]
- 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[edit | edit source]
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[edit | edit source]
- Intrare
- matricein.txt
- 30001 4 4
- 0 1
- 1 0 0 1
- Ieșire
- Datele de intrare NU corespund restricțiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 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)
</syntaxhighlight>