2194 - identice3
Enunt
Mihai a construit o matrice pătratică A de dimensiune N cu valori în mulțimea {0,1}. El preferă acele matrice care au toate elementele identice și de aceea a calculat pentru matricea A, numărul K de submatrice care au toate elementele identice. Acum, Mihai vrea să transforme matricea A într-o matrice cu toate elementele identice. Pentru aceasta, el a selectat un număr natural nenul D, și definește operația ZET care constă în alegerea unei submatrice pătratice de dimensiunea D din matricea precedentă în care schimbă toate elementele 0 în 1 și invers. El vrea să aplice operația ZET inițial pentru matricea A, apoi repetă operația pentru matricea obținută la momentul anterior, de un număr minim de ori, notat R, până când matricea obținută are toate elementele identice, sau dacă nu este posibil, R va avea valoarea -1.
Cerința
Mihai vă roagă să calculați valorile K și R. Pentru a preciza tipul cerinței, Mihai folosește un cod T care dacă are valoarea 1, atunci solicită calcularea valorii K, iar dacă T are valoarea 2, atunci solicită calcularea valorii R.
Date de intrare
Fișierul de intrare identice3IN.txt se vor afla numerele naturale T, N și D, cu semnificația de mai sus, separate prin câte un spațiu. Pe următoarele N linii se vor afla câte N valori de 0 și 1, elementele liniilor matricei A, fără spații între ele.
Date de ieșire
Fișierul de ieșire identice3OUT.txt se va afla un număr natural, respectiv valoarea K pentru T = 1 sau valoarea R pentru T = 2.
Restricții și precizări
1 < D < N ≤ 1000- Pentru calcularea valorii
K, submatricele pot fi pătratice sau dreptunghiulare, cu diferite dimensiuni (inclusiv1), cu elementele identice.
Exemplul 1:
identice3IN.txt
1 4 2 0011 0011 1100 1100
identice3OUT.txt
36
Explicație
T = 1, deci se calculează K = 36. Sunt 18 submatrice cu toate elementele 0 și 18 cu toate elementele 1.
Exemplul 2:
identice3IN.txt
2 4 2 0011 0011 1100 1100
identice3OUT.txt
2
Explicație
T = 2, deci se calculează R = 2, deoarece sunt necesare 2 aplicări ale operației ZET.
Exemplul 3:
identice3IN.txt
1 1001 2 0011 0011 1100 1100
identice3OUT.txt
Datele nu corespund restrictiilor impuse
Rezolvare
<syntaxhighlight lang="python3" line="1"> Nmax = 1005 opus = {'0': '1', '1': '0'} t0 = [[0] * Nmax for _ in range(Nmax)] st0 = [0] * Nmax val0 = [0] * Nmax t1 = [[0] * Nmax for _ in range(Nmax)] st1 = [0] * Nmax val1 = [0] * Nmax M0 = [[0] * Nmax for _ in range(Nmax)] M1 = [[0] * Nmax for _ in range(Nmax)] p0 = [0] * Nmax p1 = [0] * Nmax
def check_restrictions():
return 1 < d < n <= 1000
def read():
global test, n, d, a, a1
with open("identice3IN.txt", 'r') as in_file:
test, n, d = map(int, in_file.readline().split())
if not check_restrictions():
return False
a = [[] * (n + 2) for _ in range(n + 2)] # Adjusted size
a1 = [[] * (n + 1) for _ in range(n + 1)] # Adjusted size
for i in range(1, n + 1):
a[i][1:n + 1] = in_file.readline().strip()
for j in range(1, n + 1):
a1[i][j] = opus[a[i][j]]
return True
def solve0():
global sum0, a
sum0 = 0
for j in range(1, n + 1):
vf0 = 0
for i in range(1, n + 1):
if a[i][j] == '0':
t0[i][j + 1] = 1 + t0[i][j]
m = 1
while vf0 > 0 and st0[vf0] >= t0[i][j + 1]:
m += val0[vf0]
vf0 -= 1
vf0 += 1
st0[vf0] = t0[i][j + 1]
val0[vf0] = m
sum0 += val0[vf0] * st0[vf0]
def solve1():
global sum1, a
sum1 = 0
for j in range(1, n + 1):
vf1 = 0
for i in range(1, n + 1):
if a[i][j] == '1':
t1[i][j + 1] = 1 + t1[i][j]
m = 1
while vf1 > 0 and st1[vf1] >= t1[i][j + 1]:
m += val1[vf1]
vf1 -= 1
vf1 += 1
st1[vf1] = t1[i][j + 1]
val1[vf1] = m
sum1 += val1[vf1] * st1[vf1]
def R0():
global sol0, a
sol0 = 0
for i in range(1, n + 1):
for j in range(1, n + 1):
M0[i][j] += M0[i - 1][j]
p0[j] = p0[j - 1] + M0[i][j]
t = p0[j] & 1
if i > n - d + 1 or j > n - d + 1:
if t != int(a[i][j]):
return -1
elif t != int(a[i][j]):
sol0 += 1
M0[i][j] += 1
M0[i + d][j] -= 1
M0[i][j + d] -= 1
M0[i + d][j + d] += 1
p0[j] += 1
return sol0
def R1():
global sol1, a
sol1 = 0
for i in range(1, n + 1):
for j in range(1, n + 1):
M1[i][j] += M1[i - 1][j]
p1[j] = p1[j - 1] + M1[i][j]
t = p1[j] & 1
if i > n - d + 1 or j > n - d + 1:
if t != int(a1[i][j]):
return -1
elif t != int(a1[i][j]):
sol1 += 1
M1[i][j] += 1
M1[i + d][j] -= 1
M1[i][j + d] -= 1
M1[i + d][j + d] += 1
p1[j] += 1
return sol1
def main():
if not read():
with open("identice3OUT.txt", 'w') as out_file:
out_file.write("Datele nu corespund restrictiilor impuse\n")
return
if test == 1:
solve0()
solve1()
with open("identice3OUT.txt", 'w') as out_file:
out_file.write(str(sum0 + sum1) + '\n')
else:
R0_result = R0()
R1_result = R1()
rx = min(R0_result, R1_result)
ry = max(R0_result, R1_result)
if rx == -1:
rx = ry
with open("identice3OUT.txt", 'w') as out_file:
out_file.write(str(rx) + '\n')
if __name__ == "__main__":
main()
</syntaxhighlight>