<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=3632_-_Matrix_replace</id>
	<title>3632 - Matrix replace - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=3632_-_Matrix_replace"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3632_-_Matrix_replace&amp;action=history"/>
	<updated>2026-05-01T14:15:09Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3632_-_Matrix_replace&amp;diff=10205&amp;oldid=prev</id>
		<title>RaulOtet: Pagină nouă: Aky, un elev pasionat de matematică, analiza într-o zi curios o matrice pătratică de dimensiune &lt;code&gt;N&lt;/code&gt;. Acesta a observat că această matrice are anumite submatrice, la rândul lor pătratice, ale căror elemente sunt egale. Astfel și-a pus o întrebare: pentru o matrice dată, care este submatricea pătratică de dimensiune maximă a acesteia cu toate elementele egale pe care o pot obține, știind că am voie să schimb valoarea a maxim &lt;code&gt;K&lt;/code&gt; elemente...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3632_-_Matrix_replace&amp;diff=10205&amp;oldid=prev"/>
		<updated>2024-07-31T12:45:54Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: Aky, un elev pasionat de matematică, analiza într-o zi curios o matrice pătratică de dimensiune &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Acesta a observat că această matrice are anumite submatrice, la rândul lor pătratice, ale căror elemente sunt egale. Astfel și-a pus o întrebare: pentru o matrice dată, care este submatricea pătratică de dimensiune maximă a acesteia cu toate elementele egale pe care o pot obține, știind că am voie să schimb valoarea a maxim &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; elemente...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Aky, un elev pasionat de matematică, analiza într-o zi curios o matrice pătratică de dimensiune &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Acesta a observat că această matrice are anumite submatrice, la rândul lor pătratice, ale căror elemente sunt egale. Astfel și-a pus o întrebare: pentru o matrice dată, care este submatricea pătratică de dimensiune maximă a acesteia cu toate elementele egale pe care o pot obține, știind că am voie să schimb valoarea a maxim &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; elemente din matricea dată cu orice valoare consider și care este numărul minim de elemente ce trebuie schimbate pentru a obține o astfel de submatrice. Acesta ar rezolva problema de unul singur, dar este ocupat chiar acum deci vă cere vouă ajutorul!&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;matrix_replace.in&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, reprezentând dimensiunea matricei inițiale, respectiv câte elemente am voie maxim să schimb din aceasta, iar pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii câte &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale reprezentând elementele matricei inițiale.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;matrix_replace.out&amp;lt;/code&amp;gt; va conține pe prima linie numărele &amp;lt;code&amp;gt;D M&amp;lt;/code&amp;gt;, reprezentând dimesiunea maximă a unei submatrice cu proprietatea din enunț, respectiv numărul minim de elemente ale căror valori trebuie schimbate pentru a obține această submatrice.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 150&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ K ≤ N * N&amp;lt;/code&amp;gt;&lt;br /&gt;
* elementele matricei vor fi numere naturale mai mici sau egale ca &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru o matrice dată, o submatrice a acesteia având coordonatele colțului stânga-sus &amp;lt;code&amp;gt;x1 y1&amp;lt;/code&amp;gt; și coordonatele colțului dreapta-jos &amp;lt;code&amp;gt;x2 y2&amp;lt;/code&amp;gt; este formată din toate elementele din matrice având indicele liniei în intervalul &amp;lt;code&amp;gt;[x1, x2]&amp;lt;/code&amp;gt; și indicele coloanei în intervalul &amp;lt;code&amp;gt;[y1, y2]&amp;lt;/code&amp;gt;. Această submatrice se numește submatrice pătratică dacă are același număr de linii și coloane&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Subtask 1&amp;#039;&amp;#039;&amp;#039;: pentru &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; de puncte &amp;lt;code&amp;gt;N ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Subtask 2&amp;#039;&amp;#039;&amp;#039;: pentru alte &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; de puncte numărul de valori distince din matrice este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;K = 0&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;N ≤ 150&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Subtask 3&amp;#039;&amp;#039;&amp;#039;: pentru alte &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; de puncte pot exista oricâte valori distincte în matrice, &amp;lt;code&amp;gt;N ≤ 100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;K ≤ N * N&amp;lt;/code&amp;gt; și valoarea maximă din matrice este mai mică sau egală decât &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Subtask 4&amp;#039;&amp;#039;&amp;#039;: pentru restul punctelor se păstrează condițiile inițiale: &amp;lt;code&amp;gt;1 ≤ N ≤ 150&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0 ≤ K ≤ N * N&amp;lt;/code&amp;gt; și elementele matricei vor fi numere naturale nenule mai mici sau egale ca &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;matrix_replace.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 5&lt;br /&gt;
 1 2 3&lt;br /&gt;
 4 5 6&lt;br /&gt;
 7 8 9&lt;br /&gt;
&amp;lt;code&amp;gt;matrix_replace.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 3&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Putem de exemplu obține o submatrice pătratică de dimenisiune &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; schimbând valorile elementelor de coordonate: &amp;lt;code&amp;gt;1 2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2 1&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;2 2&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Observăm că numărul minim de schimbări de elemente este &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, deci în acest caz &amp;lt;code&amp;gt;K = 5&amp;lt;/code&amp;gt;, numărul de schimbări maxime pe care le putem efectua, nu este atins.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def preprocess_matrix(matrix, N):&lt;br /&gt;
    # Compute the prefix sum matrix&lt;br /&gt;
    prefix_sum = [[0] * (N + 1) for _ in range(N + 1)]&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(N):&lt;br /&gt;
            prefix_sum[i + 1][j + 1] = matrix[i][j] + prefix_sum[i + 1][j] + prefix_sum[i][j + 1] - prefix_sum[i][j]&lt;br /&gt;
    return prefix_sum&lt;br /&gt;
&lt;br /&gt;
def num_changes_to_uniform(matrix, prefix_sum, N, size, top, left):&lt;br /&gt;
    # Calculate the number of changes to make the submatrix uniform&lt;br /&gt;
    total_elements = size * size&lt;br /&gt;
    sum_elements = (prefix_sum[top + size][left + size] - prefix_sum[top + size][left]&lt;br /&gt;
                    - prefix_sum[top][left + size] + prefix_sum[top][left])&lt;br /&gt;
    # The most frequent element will be the target, so calculate changes needed&lt;br /&gt;
    # Assume the target value is 1&lt;br /&gt;
    changes_if_target_1 = total_elements - sum_elements&lt;br /&gt;
    # Assume the target value is 0&lt;br /&gt;
    changes_if_target_0 = sum_elements&lt;br /&gt;
    return min(changes_if_target_1, changes_if_target_0)&lt;br /&gt;
&lt;br /&gt;
def find_max_square_submatrix(matrix, N, K):&lt;br /&gt;
    prefix_sum = preprocess_matrix(matrix, N)&lt;br /&gt;
    &lt;br /&gt;
    max_size = 0&lt;br /&gt;
    min_changes = float(&amp;#039;inf&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    for size in range(1, N + 1):&lt;br /&gt;
        for i in range(N - size + 1):&lt;br /&gt;
            for j in range(N - size + 1):&lt;br /&gt;
                changes = num_changes_to_uniform(matrix, prefix_sum, N, size, i, j)&lt;br /&gt;
                if changes &amp;lt;= K:&lt;br /&gt;
                    if size &amp;gt; max_size:&lt;br /&gt;
                        max_size = size&lt;br /&gt;
                        min_changes = changes&lt;br /&gt;
                    elif size == max_size:&lt;br /&gt;
                        min_changes = min(min_changes, changes)&lt;br /&gt;
                        &lt;br /&gt;
    return max_size, min_changes&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
N = 4&lt;br /&gt;
K = 3&lt;br /&gt;
matrix = [&lt;br /&gt;
    [1, 0, 0, 1],&lt;br /&gt;
    [0, 1, 0, 0],&lt;br /&gt;
    [1, 1, 1, 0],&lt;br /&gt;
    [1, 0, 1, 1]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
max_size, min_changes = find_max_square_submatrix(matrix, N, K)&lt;br /&gt;
print(f&amp;quot;Dimensiunea maximă: {max_size}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;Numărul minim de schimbări: {min_changes}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
</feed>