<?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=1103_-_Harta</id>
	<title>1103 - Harta - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1103_-_Harta"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1103_-_Harta&amp;action=history"/>
	<updated>2026-05-01T02:53:27Z</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=1103_-_Harta&amp;diff=9722&amp;oldid=prev</id>
		<title>Raul: Pagină nouă: Pe baza unei imagini preluate din satelit, se realizează harta unei mici localități. Localitatea ocupă o suprafață dreptunghiulară, cu laturile orientate pe direcțiile Nord-Sud, respectiv Est-Vest. Studiind imaginea obținută de la satelit, cartografii au constatat că toate cele &lt;code&gt;k&lt;/code&gt; clădiri au forma unor dreptunghiuri distincte. Imaginea poate fi reprezentată sub forma unui tablou cu &lt;code&gt;n•m&lt;/code&gt; celule așezate pe &lt;code&gt;n&lt;/code&gt; linii numerotate...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1103_-_Harta&amp;diff=9722&amp;oldid=prev"/>
		<updated>2024-03-26T16:45:08Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: Pe baza unei imagini preluate din satelit, se realizează harta unei mici localități. Localitatea ocupă o suprafață dreptunghiulară, cu laturile orientate pe direcțiile Nord-Sud, respectiv Est-Vest. Studiind imaginea obținută de la satelit, cartografii au constatat că toate cele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; clădiri au forma unor dreptunghiuri distincte. Imaginea poate fi reprezentată sub forma unui tablou cu &amp;lt;code&amp;gt;n•m&amp;lt;/code&amp;gt; celule așezate pe &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii numerotate...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Pe baza unei imagini preluate din satelit, se realizează harta unei mici localități. Localitatea ocupă o suprafață dreptunghiulară, cu laturile orientate pe direcțiile Nord-Sud, respectiv Est-Vest. Studiind imaginea obținută de la satelit, cartografii au constatat că toate cele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; clădiri au forma unor dreptunghiuri distincte. Imaginea poate fi reprezentată sub forma unui tablou cu &amp;lt;code&amp;gt;n•m&amp;lt;/code&amp;gt; celule așezate pe &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Numim drum, un dreptunghi al tabloului care străbate întreaga localitate pe direcția Est-Vest și are un număr maxim de linii sau un dreptunghi care străbate întreaga localitate pe direcția Nord-Sud și are un număr maxim de coloane. Drumurile, evident, nu trebuie să treacă prin clădiri.&lt;br /&gt;
&lt;br /&gt;
Cartografii sunt interesați ca pe această hartă să fie reprezentate la scară doar clădirile, nu și drumurile. De aceea, pentru realizarea hărții, lățimile drumurilor au fost reduse la o singură celulă&lt;br /&gt;
&lt;br /&gt;
Tabloul care reprezintă imaginea localității se codifică astfel: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; pentru o celulă ocupată de o clădire și &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; pentru o celulă neocupată.&lt;br /&gt;
&lt;br /&gt;
= Cerinţe =&lt;br /&gt;
Cunoscând &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, precum și tabloul care codifică imaginea, se cere să se determine:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1.&amp;#039;&amp;#039;&amp;#039; Numărul &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; de celule ocupate de către clădirea pătratică cu latura maximă și numărul de clădiri &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; alese dintre celelalte &amp;lt;code&amp;gt;k – 1&amp;lt;/code&amp;gt; clădiri, cu proprietatea că fiecare dintre ele “încape” în interiorul clădirii pătratice cu latură maximă, fără să se suprapună peste celulele marginale ale acesteia.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2.&amp;#039;&amp;#039;&amp;#039; Tabloul care reprezintă harta, în urma prelucrării imaginii inițiale.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;harta.in&amp;lt;/code&amp;gt; conţine pe prima linie un număr natural &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;. Pentru toate testele de intrare, numărul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; poate avea doar valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau valoarea &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pe linia a doua se găsesc numerele naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
Pe fiecare dintre următoarele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii, se găsesc câte patru numere naturale &amp;lt;code&amp;gt;i1 j1 i2 j2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
separate prin câte un spațiu, primele două numere reprezentând coordonatele celulei din extremitatea Nord-Vest, iar ultimele două, coordonatele celulei din extremitatea Sud-Est pentru fiecare dintre cele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; clădiri.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
&lt;br /&gt;
* Dacă valoarea lui &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, atunci se va rezolva numai cerința &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. În acest caz, în fişierul de ieşire &amp;lt;code&amp;gt;harta.out&amp;lt;/code&amp;gt; se vor scrie cele două numere &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; având semnificația descrisă la cerința &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, separate printr-un singur spațiu.&lt;br /&gt;
* Dacă valoarea lui &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, atunci se va rezolva numai cerința &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;. În acest caz, fişierul de ieşire &amp;lt;code&amp;gt;harta.out&amp;lt;/code&amp;gt; va conține tabloul care reprezintă harta obținută pe baza imaginii din satelit. Fișierul va avea &amp;lt;code&amp;gt;n1&amp;lt;/code&amp;gt; linii. Pe fiecare linie se vor găsi câte &amp;lt;code&amp;gt;m1&amp;lt;/code&amp;gt; valori &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; separate prin câte un singur spațiu. Celulele situate pe marginile clădirilor vor avea valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Celulele din interiorul clădirilor, ca și cele din exterior, vor avea valoarea &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3 ≤ n, m ≤ 1500&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ i1 ≤ i2 ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ j1 ≤ j2 ≤ m&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Lmax ≤ 50&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;Lmax&amp;lt;/code&amp;gt; – latura maximă a unui dreptunghi)&lt;br /&gt;
* Se garantează că există soluție pentru ambele cerințe, pentru toate datele de test.&lt;br /&gt;
* Pentru rezolvarea corectă a primei cerinţe se acordă 20 de puncte, iar pentru cerința a doua se acordă 80 de puncte.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;harta.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 7 7 4&lt;br /&gt;
 1 1 4 4&lt;br /&gt;
 6 2 6 4&lt;br /&gt;
 3 6 3 6&lt;br /&gt;
 6 6 7 7&lt;br /&gt;
&amp;lt;code&amp;gt;harta.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 16 2&lt;br /&gt;
&lt;br /&gt;
== Încărcare soluție ==&lt;br /&gt;
&lt;br /&gt;
=== Lipește codul aici ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define pb push_back&lt;br /&gt;
#define DIM 1501&lt;br /&gt;
typedef vector&amp;lt;int&amp;gt; VI;&lt;br /&gt;
&lt;br /&gt;
d = []&lt;br /&gt;
xa = []&lt;br /&gt;
ya = []&lt;br /&gt;
x = [0]&lt;br /&gt;
y = [0]&lt;br /&gt;
s1 = [True]&lt;br /&gt;
s2 = [True]&lt;br /&gt;
c1 = []&lt;br /&gt;
c2 = []&lt;br /&gt;
b1 = []&lt;br /&gt;
b2 = []&lt;br /&gt;
k = 0&lt;br /&gt;
N = 0&lt;br /&gt;
M = 0&lt;br /&gt;
n = 0&lt;br /&gt;
m = 0&lt;br /&gt;
Lmax = 0&lt;br /&gt;
L = 0&lt;br /&gt;
H = 0&lt;br /&gt;
T = 0&lt;br /&gt;
nr_dr = 0&lt;br /&gt;
A = np.zeros((1501, 1501), dtype=bool)&lt;br /&gt;
&lt;br /&gt;
def GetPos(v, val):&lt;br /&gt;
    n = len(v)&lt;br /&gt;
    lo = 0&lt;br /&gt;
    hi = n&lt;br /&gt;
    while lo &amp;lt;= hi:&lt;br /&gt;
        mid = lo + (hi - lo) // 2&lt;br /&gt;
        if v[mid] == val:&lt;br /&gt;
            return mid&lt;br /&gt;
        if val &amp;lt; v[mid]:&lt;br /&gt;
            hi = mid - 1&lt;br /&gt;
        else:&lt;br /&gt;
            lo = mid + 1&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
def WriteMatr(a, N, M):&lt;br /&gt;
    for i in range(1, N+1):&lt;br /&gt;
        for j in range(1, M+1):&lt;br /&gt;
            fout.write(str(int(a[i][j])) + &amp;#039; &amp;#039;)&lt;br /&gt;
        fout.write(&amp;#039;\n&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;harta.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
    lines = fin.readlines()&lt;br /&gt;
    T, N, M, k = map(int, lines[0].split())&lt;br /&gt;
    imax = 0&lt;br /&gt;
    jmax = 0&lt;br /&gt;
    for i in range(k):&lt;br /&gt;
        i1, j1, i2, j2 = map(int, lines[i+1].split())&lt;br /&gt;
        d.append((i1, j1, i2, j2))&lt;br /&gt;
        L = i2 - i1 + 1&lt;br /&gt;
        H = j2 - j1 + 1&lt;br /&gt;
        if L == H and L &amp;gt; Lmax:&lt;br /&gt;
            Lmax = L&lt;br /&gt;
        for i in range(i1, i2+1):&lt;br /&gt;
            xa.extend([i, i])&lt;br /&gt;
            ya.extend([j1, j2])&lt;br /&gt;
            if not s1[i]:&lt;br /&gt;
                x.append(i)&lt;br /&gt;
                s1[i] = True&lt;br /&gt;
        for j in range(j1, j2+1):&lt;br /&gt;
            xa.extend([i1, i2])&lt;br /&gt;
            ya.extend([j, j])&lt;br /&gt;
            if not s2[j]:&lt;br /&gt;
                y.append(j)&lt;br /&gt;
                s2[j] = True&lt;br /&gt;
        if not s1[i1 - 1]:&lt;br /&gt;
            x.append(i1 - 1)&lt;br /&gt;
            s1[i1 - 1] = True&lt;br /&gt;
        if not s2[j1 - 1]:&lt;br /&gt;
            y.append(j1 - 1)&lt;br /&gt;
            s2[j1 - 1] = True&lt;br /&gt;
        imax = max(imax, i2)&lt;br /&gt;
        jmax = max(jmax, j2)&lt;br /&gt;
    if T == 1:&lt;br /&gt;
        for i in range(k):&lt;br /&gt;
            L = d[i][2] - d[i][0] + 1&lt;br /&gt;
            H = d[i][3] - d[i][1] + 1&lt;br /&gt;
            if L &amp;lt; Lmax - 1 and H &amp;lt; Lmax - 1:&lt;br /&gt;
                nr_dr += 1&lt;br /&gt;
        fout.write(str(Lmax * Lmax) + &amp;#039; &amp;#039; + str(nr_dr) + &amp;#039;\n&amp;#039;)&lt;br /&gt;
    else:&lt;br /&gt;
        c1 = [0] * (imax + 1)&lt;br /&gt;
        c2 = [0] * (jmax + 1)&lt;br /&gt;
        for i in range(len(x)):&lt;br /&gt;
            c1[x[i]] += 1&lt;br /&gt;
        for i in range(len(y)):&lt;br /&gt;
            c2[y[i]] += 1&lt;br /&gt;
        for i in range(1, imax+1):&lt;br /&gt;
            c1[i] += c1[i - 1]&lt;br /&gt;
        for i in range(1, jmax+1):&lt;br /&gt;
            c2[i] += c2[i - 1]&lt;br /&gt;
        b1 = [0] * len(x)&lt;br /&gt;
        b2 = [0] * len(y)&lt;br /&gt;
        for i in range(len(x)):&lt;br /&gt;
            b1[c1[x[i]] - 1] = x[i]&lt;br /&gt;
            c1[x[i]] -= 1&lt;br /&gt;
        for i in range(len(y)):&lt;br /&gt;
            b2[c2[y[i]] - 1] = y[i]&lt;br /&gt;
            c2[y[i]] -= 1&lt;br /&gt;
        n = 0&lt;br /&gt;
        m = 0&lt;br /&gt;
        for k in range(len(xa)):&lt;br /&gt;
            i = GetPos(b1, xa[k])&lt;br /&gt;
            j = GetPos(b2, ya[k])&lt;br /&gt;
            n = max(n, i)&lt;br /&gt;
            m = max(m, j)&lt;br /&gt;
            A[i][j] = True&lt;br /&gt;
        if n &amp;lt; M:&lt;br /&gt;
            n += 1&lt;br /&gt;
        if m &amp;lt; M:&lt;br /&gt;
            m += 1&lt;br /&gt;
        WriteMatr(A, n, m)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raul</name></author>
	</entry>
</feed>