<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Aurelia+Raluca</id>
	<title>Bitnami MediaWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Aurelia+Raluca"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/wiki/Special:Contributions/Aurelia_Raluca"/>
	<updated>2026-05-01T06:47:27Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2150_-_Credite&amp;diff=9719</id>
		<title>2150 - Credite</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2150_-_Credite&amp;diff=9719"/>
		<updated>2024-03-23T00:30:27Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: Pagină nouă: == Enunț == Maria este studentă în anul I la facultatea de informatică și a primit o listă de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; probleme, 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;, pe care trebuie să le rezolve la cursul de algoritmică, rezolvarea unei probleme durând exact o unitate de timp. Pentru că profesorul vrea să testeze capacitatea elevilor de a a face cele mai bune alegeri, pentru fiecare problemă acesta a stabilit numărul de credite (&amp;lt;code&amp;gt;Ci&amp;lt;/code&amp;gt;) pe care stud...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Maria este studentă în anul I la facultatea de informatică și a primit o listă de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; probleme, 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;, pe care trebuie să le rezolve la cursul de algoritmică, rezolvarea unei probleme durând exact o unitate de timp. Pentru că profesorul vrea să testeze capacitatea elevilor de a a face cele mai bune alegeri, pentru fiecare problemă acesta a stabilit numărul de credite (&amp;lt;code&amp;gt;Ci&amp;lt;/code&amp;gt;) pe care studentul le va primi dacă rezolvă problema &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, dar și un număr limită de unități de timp (&amp;lt;code&amp;gt;Ti&amp;lt;/code&amp;gt;) până la care problema poate fi rezolvată.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând numărul de probleme, numărul de credite al fiecărei probleme precum și timpul limită de rezolvare al fiecărei probleme, scrieți un algoritm care determină &amp;lt;code&amp;gt;numărul maxim&amp;lt;/code&amp;gt; de credite pe care le poate obține Maria.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Pe prima linie a fișierului de intrare &amp;lt;code&amp;gt;crediteIN.txt&amp;lt;/code&amp;gt; se găsește un număr natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, reprezentând numărul de probleme de pe listă.&lt;br /&gt;
&lt;br /&gt;
Pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii din fișierul de intrare vor fi datele despre fiecare problemă, pe linia &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt; găsindu-se &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; numere naturale &amp;lt;code&amp;gt;Ci&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Ti&amp;lt;/code&amp;gt; care reprezintă numărul de credite, respectiv timpul limită pentru problema &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
În fișierul &amp;lt;code&amp;gt;crediteOUT.txt&amp;lt;/code&amp;gt; se va afișa un singur număr natural, reprezentând numărul maxim de credite pe care Maria le poate obține.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ n ≤ 10000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ Ci ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Ti ≤ 10000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;crediteIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 10 3&lt;br /&gt;
 7 5&lt;br /&gt;
 8 1&lt;br /&gt;
 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;crediteOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 25&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Maria alege să rezolve problema 3, renunțând la problema 4 pentru ca are mai puține credite și același timp limită ca problema 3. După aceea va rezolva problemele 1 și 2, adunând în total 25 de credite.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;crediteIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 10001&lt;br /&gt;
 10 3&lt;br /&gt;
 7 5&lt;br /&gt;
 8 1&lt;br /&gt;
 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;crediteOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, v):&lt;br /&gt;
    if not (2 &amp;lt;= n &amp;lt;= 10000):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for nrC, timpul in v:&lt;br /&gt;
        if not (2 &amp;lt;= nrC &amp;lt;= 1000) or not (1 &amp;lt;= timpul &amp;lt;= 10000):&lt;br /&gt;
            return False&lt;br /&gt;
    &lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;crediteIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;crediteOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
        ans = 0&lt;br /&gt;
        v = []&lt;br /&gt;
        timp = [False] * 10001&lt;br /&gt;
        tmax = 0&lt;br /&gt;
&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            line = fin.readline().strip()&lt;br /&gt;
            if not line:&lt;br /&gt;
                continue  # Ignoră liniile goale&lt;br /&gt;
&lt;br /&gt;
            vals = line.split()&lt;br /&gt;
            if len(vals) &amp;lt; 2:&lt;br /&gt;
                fout.write(&amp;quot;Datele din fisier nu sunt formatate corect&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
            &lt;br /&gt;
            nrC, timpul = map(int, vals)&lt;br /&gt;
            v.append((nrC, timpul))&lt;br /&gt;
            if timpul &amp;gt; tmax:&lt;br /&gt;
                tmax = timpul&lt;br /&gt;
            timp[timpul] = True&lt;br /&gt;
&lt;br /&gt;
        if not verifica_restrictii(n, v):&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        q = []&lt;br /&gt;
&lt;br /&gt;
        for i in range(tmax, 0, -1):&lt;br /&gt;
            if timp[i]:&lt;br /&gt;
                for nrC, timpul in v:&lt;br /&gt;
                    if timpul == i:&lt;br /&gt;
                        heapq.heappush(q, (-nrC, timpul))&lt;br /&gt;
&lt;br /&gt;
            if q:&lt;br /&gt;
                nrC, timpul = heapq.heappop(q)&lt;br /&gt;
                ans += -nrC&lt;br /&gt;
    &lt;br /&gt;
        fout.write(str(ans))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0950_-_Cerc_3&amp;diff=9718</id>
		<title>0950 - Cerc 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0950_-_Cerc_3&amp;diff=9718"/>
		<updated>2024-03-23T00:19:30Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: Pagină nouă: == Enunț == Se consideră pe axa &amp;lt;code&amp;gt;Ox&amp;lt;/code&amp;gt; din plan n puncte distincte reprezentând centrele a &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cercuri numerotate cu numerele distincte 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;. Pentru fiecare cerc &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; se cunosc abscisa &amp;lt;code&amp;gt;xk&amp;lt;/code&amp;gt; a centrului său şi raza sa &amp;lt;code&amp;gt;rk&amp;lt;/code&amp;gt;.  = Cerința = Să se scrie un program care să determine numărul &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; maxim de cercuri exterioare două câte două dintre cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.  = Date de...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Se consideră pe axa &amp;lt;code&amp;gt;Ox&amp;lt;/code&amp;gt; din plan n puncte distincte reprezentând centrele a &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cercuri numerotate cu numerele distincte 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;. Pentru fiecare cerc &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; se cunosc abscisa &amp;lt;code&amp;gt;xk&amp;lt;/code&amp;gt; a centrului său şi raza sa &amp;lt;code&amp;gt;rk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se scrie un program care să determine numărul &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; maxim de cercuri exterioare două câte două dintre cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;cerc3IN.txt&amp;lt;/code&amp;gt; conține pe prima linie pe prima linie, o valoare naturală n, reprezentând numărul de cercuri, iar pe următoarele n linii câte două numere naturale, separate printr-un spaţiu, care reprezintă abscisa &amp;lt;code&amp;gt;x1&amp;lt;/code&amp;gt; a centrului primului cerc şi raza sa &amp;lt;code&amp;gt;r1&amp;lt;/code&amp;gt;,…, abscisa &amp;lt;code&amp;gt;xn&amp;lt;/code&amp;gt; a centrului celui de-al &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;-lea cerc şi raza sa &amp;lt;code&amp;gt;rn&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;cerc3OUT.txt&amp;lt;/code&amp;gt; va conține o linie pe care va fi scris numărul natural &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; reprezentând numărul maxim de cercuri exterioare ale căror centre sunt situate pe axa &amp;lt;code&amp;gt;Ox&amp;lt;/code&amp;gt;. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x1&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;x2&amp;lt;/code&amp;gt;,…,&amp;lt;code&amp;gt;xn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r2&amp;lt;/code&amp;gt;,…, &amp;lt;code&amp;gt;rn&amp;lt;/code&amp;gt; sunt numere naturale&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 300&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤&amp;lt;/code&amp;gt;  &amp;lt;code&amp;gt;x1&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;x2&amp;lt;/code&amp;gt;,…,&amp;lt;code&amp;gt;xn&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;≤ 150&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;r1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r2&amp;lt;/code&amp;gt;,…, &amp;lt;code&amp;gt;rn&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;≤ 70&amp;lt;/code&amp;gt;&lt;br /&gt;
* dacă două cercuri, dintre cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, au centrele în acelaşi punct de pe axa &amp;lt;code&amp;gt;Ox&amp;lt;/code&amp;gt;, atunci razele lor sunt distincte&lt;br /&gt;
* două cercuri sunt exterioare dacă nu au niciun punct comun şi nici interioarele lor nu au puncte comune&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;cerc3IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8&lt;br /&gt;
 3 1&lt;br /&gt;
 1 4&lt;br /&gt;
 8 1&lt;br /&gt;
 11 2&lt;br /&gt;
 15 2&lt;br /&gt;
 16 6&lt;br /&gt;
 21 2&lt;br /&gt;
 21 1&lt;br /&gt;
&amp;lt;code&amp;gt;cerc3OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Numărul maxim de cercuri exterioare două câte două este &amp;lt;code&amp;gt;y=4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;cerc3IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 301&lt;br /&gt;
 3 1&lt;br /&gt;
 1 4&lt;br /&gt;
 8 1&lt;br /&gt;
 11 2&lt;br /&gt;
 15 2&lt;br /&gt;
 16 6&lt;br /&gt;
 21 2&lt;br /&gt;
 21 1&lt;br /&gt;
&amp;lt;code&amp;gt;cerc3OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verificare_restrictii(n, cercuri):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 300:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for x, r in cercuri:&lt;br /&gt;
        if x &amp;lt; 1 or x &amp;gt; 150 or r &amp;lt; 1 or r &amp;gt; 70:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;cerc3IN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f, open(&amp;quot;cerc3OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
        n_line = f.readline().strip()&lt;br /&gt;
        &lt;br /&gt;
        if not n_line:&lt;br /&gt;
            g.write(&amp;quot;Datele din fisierul de intrare lipsesc sau sunt incomplete.&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            n = int(n_line)&lt;br /&gt;
        except ValueError:&lt;br /&gt;
            g.write(&amp;quot;Numarul de cercuri este invalid.&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        cercuri = []&lt;br /&gt;
        for line in f:&lt;br /&gt;
            values = line.split()&lt;br /&gt;
            if len(values) != 2:&lt;br /&gt;
                g.write(&amp;quot;Datele din fisierul de intrare sunt incomplete sau au format invalid.&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                o, r = map(int, values)&lt;br /&gt;
            except ValueError:&lt;br /&gt;
                g.write(&amp;quot;Coordonatele sau razele cercurilor sunt invalide.&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
            &lt;br /&gt;
            cercuri.append((o, r))&lt;br /&gt;
&lt;br /&gt;
        if not verificare_restrictii(n, cercuri):&lt;br /&gt;
            g.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        cercuri = [(o - r, o + r) for o, r in cercuri]&lt;br /&gt;
        cercuri.sort(key=lambda x: x[1])&lt;br /&gt;
&lt;br /&gt;
        nr = 1&lt;br /&gt;
        x = cercuri[0][1]&lt;br /&gt;
        for i in range(1, n):&lt;br /&gt;
            if x &amp;lt; cercuri[i][0]:&lt;br /&gt;
                nr += 1&lt;br /&gt;
                x = cercuri[i][1]&lt;br /&gt;
&lt;br /&gt;
        g.write(str(nr))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0384_-_Saritura_Calului_1&amp;diff=9717</id>
		<title>0384 - Saritura Calului 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0384_-_Saritura_Calului_1&amp;diff=9717"/>
		<updated>2024-03-23T00:13:39Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: Pagină nouă: = Cerinţa = Se consideră o tablă de şah cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane. La o poziţie dată se află un cal de şah, acesta putându-se deplasa pe tablă în modul specific acestei piese de şah (în L).  Să se determine o modalitate de parcurgere a tablei de către calul dat, astfel încât acesta să nu treacă de două ori prin aceeaşi poziţie. Parcurgerea constă într-o matrice cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane, fiecare element...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se consideră o tablă de şah cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane. La o poziţie dată se află un cal de şah, acesta putându-se deplasa pe tablă în modul specific acestei piese de şah (în L).&lt;br /&gt;
&lt;br /&gt;
Să se determine o modalitate de parcurgere a tablei de către calul dat, astfel încât acesta să nu treacă de două ori prin aceeaşi poziţie. Parcurgerea constă într-o matrice cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane, fiecare element al matricei având valoarea pasului la care se ajunge în acel element, sau &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, dacă nu s-a ajuns.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;saritura_calului1IN.txt&amp;lt;/code&amp;gt; conține numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; , apoi numere &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt;, reprezentând dimensiunile tablei (numărul de linii şi numărul de coloane) , respectiv coordonatele iniţiale ale calului (linie, coloana).&lt;br /&gt;
&lt;br /&gt;
= Date de ieşire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;saritura_calului1OUT.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii cu câte &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; numere naturale cuprinse între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n*m&amp;lt;/code&amp;gt;, separate prin exact un spațiu, reprezentând parcurgerea solicitată. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricţii şi precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n,m ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ istart ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ jstart ≤ m&amp;lt;/code&amp;gt;&lt;br /&gt;
* scorul obținut pe fiecare test este proporțional cu gradul de acoperire a tablei. Astfel, dacă tabla este acoperită în întregime, se acordă 100% din punctaj. Dacă tabla este acoperită în proporție de 70%, se acordă 70% din punctaj, etc.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;saritura_calului1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 5 1 1&lt;br /&gt;
&amp;lt;code&amp;gt;saritura_calului1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 12 7 16 3 &lt;br /&gt;
 6 17 2 11 8 &lt;br /&gt;
 13 10 19 4 15 &lt;br /&gt;
 18 5 14 9 20&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 =&lt;br /&gt;
&amp;lt;code&amp;gt;saritura_calului1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101 5 1 1&lt;br /&gt;
&amp;lt;code&amp;gt;saritura_calului1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def mutare_valida(tabla, vizitat, i, j, n, m):&lt;br /&gt;
    return 0 &amp;lt;= i &amp;lt; n and 0 &amp;lt;= j &amp;lt; m and not vizitat[i][j]&lt;br /&gt;
&lt;br /&gt;
def cal_tura(tabla, vizitat, i, j, n, m, contor_mutari):&lt;br /&gt;
    di = [-1, -2, -2, -1, 1, 2, 2, 1]&lt;br /&gt;
    dj = [-2, -1, 1, 2, 2, 1, -1, -2]&lt;br /&gt;
&lt;br /&gt;
    tabla[i][j] = contor_mutari&lt;br /&gt;
    vizitat[i][j] = True&lt;br /&gt;
    if contor_mutari == n * m:&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    for k in range(8):&lt;br /&gt;
        ni = i + di[k]&lt;br /&gt;
        nj = j + dj[k]&lt;br /&gt;
        if mutare_valida(tabla, vizitat, ni, nj, n, m):&lt;br /&gt;
            if cal_tura(tabla, vizitat, ni, nj, n, m, contor_mutari + 1):&lt;br /&gt;
                return True&lt;br /&gt;
    &lt;br /&gt;
    tabla[i][j] = 0&lt;br /&gt;
    vizitat[i][j] = False&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def verificare_restrictii(n, m, istart, jstart):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100 and 1 &amp;lt;= m &amp;lt;= 100 and 1 &amp;lt;= istart &amp;lt;= n and 1 &amp;lt;= jstart &amp;lt;= m):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afisare_tabla(tabla, fout):&lt;br /&gt;
    for row in tabla:&lt;br /&gt;
        fout.write(&#039; &#039;.join(map(str, row)) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    fin = open(&amp;quot;saritura_calului1IN.txt&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
    fout = open(&amp;quot;saritura_calului1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    n, m, istart, jstart = map(int, fin.readline().split())&lt;br /&gt;
    &lt;br /&gt;
    if not verificare_restrictii(n, m, istart, jstart):&lt;br /&gt;
        fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        tabla = [[0] * m for _ in range(n)]&lt;br /&gt;
        vizitat = [[False] * m for _ in range(n)]&lt;br /&gt;
        &lt;br /&gt;
        if cal_tura(tabla, vizitat, istart - 1, jstart - 1, n, m, 1):&lt;br /&gt;
            afisare_tabla(tabla, fout)&lt;br /&gt;
        else:&lt;br /&gt;
            fout.write(&amp;quot;Nu există soluție!&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    fin.close()&lt;br /&gt;
    fout.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0403_-_Concert&amp;diff=9716</id>
		<title>0403 - Concert</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0403_-_Concert&amp;diff=9716"/>
		<updated>2024-03-23T00:00:31Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: Pagină nouă: = Cerinţa = Gigel este un cântăreț începător. El știe deja să cânte &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; melodii, și pentru fiecare melodie se cunoaște durata, exprimată în minute și secunde. Gigel va participa la o emisiune de televiziune, unde va putea cânta timp de &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; secunde. El vrea să cânte cât mai multe melodii, pentru a-și demonstra talentul deosebit.  Ajutați-l să aleagă piesele pentru emisiune, și vă va răsplăti cu un autograf.  = Date de intrare = F...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Gigel este un cântăreț începător. El știe deja să cânte &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; melodii, și pentru fiecare melodie se cunoaște durata, exprimată în minute și secunde. Gigel va participa la o emisiune de televiziune, unde va putea cânta timp de &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; secunde. El vrea să cânte cât mai multe melodii, pentru a-și demonstra talentul deosebit.&lt;br /&gt;
&lt;br /&gt;
Ajutați-l să aleagă piesele pentru emisiune, și vă va răsplăti cu un autograf.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;concerIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n T&amp;lt;/code&amp;gt;. Fiecare dintre următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii conține durata unei melodii, în formatul &amp;lt;code&amp;gt;m:s&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; pot avea una sau două cifre.&lt;br /&gt;
&lt;br /&gt;
= Date de ieşire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;concertOUT.txt&amp;lt;/code&amp;gt; va conţine pe prima linie numărul &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, reprezentând numărul maxim de melodii care pot fi alese. Următoarea linie va conține &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; numere între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, reprezentând numărul de ordine al melodiilor alese, așa cum sunt ele date în fișierul de intrare. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricţii şi precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ T ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ m ≤ 10&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ s ≤ 59&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;concertIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 450&lt;br /&gt;
 2:30&lt;br /&gt;
 1:45&lt;br /&gt;
 2:10&lt;br /&gt;
 03:00&lt;br /&gt;
 01:15&lt;br /&gt;
 02:05&lt;br /&gt;
 2:05&lt;br /&gt;
&amp;lt;code&amp;gt;concertOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 2 5 6 7 &lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
În &amp;lt;code&amp;gt;450&amp;lt;/code&amp;gt; de secunde se pot cânta maxim &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; melodii, de exemplu cele numerotate cu: &amp;lt;code&amp;gt;2 5 6 7&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;concertIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101 450&lt;br /&gt;
 2:30&lt;br /&gt;
 1:45&lt;br /&gt;
 2:10&lt;br /&gt;
 03:00&lt;br /&gt;
 01:15&lt;br /&gt;
 02:05&lt;br /&gt;
 2:05&lt;br /&gt;
&amp;lt;code&amp;gt;concertOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verificare_restrictii(n, t):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100 and 1 &amp;lt;= t &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;concertIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;concertOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n, t = map(int, fin.readline().split())&lt;br /&gt;
        &lt;br /&gt;
        if not verificare_restrictii(n, t):&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        v = [(0, 0)] * (n + 1)  &lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            s = fin.readline().strip()&lt;br /&gt;
            hour, minute = map(int, s.split(&#039;:&#039;))&lt;br /&gt;
            if not (0 &amp;lt;= hour &amp;lt;= 10 and 0 &amp;lt;= minute &amp;lt;= 59):&lt;br /&gt;
                fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
            v[i] = (60 * hour + minute, i)&lt;br /&gt;
&lt;br /&gt;
        v.sort()&lt;br /&gt;
&lt;br /&gt;
        indici = []&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            if v[i][0] &amp;lt;= t:&lt;br /&gt;
                t -= v[i][0]&lt;br /&gt;
                indici.append(v[i][1])&lt;br /&gt;
&lt;br /&gt;
        indici.sort()&lt;br /&gt;
&lt;br /&gt;
        fout.write(str(len(indici)) + &#039;\n&#039;)&lt;br /&gt;
        fout.write(&#039; &#039;.join(map(str, indici)) + &#039; &#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0401_-_Pachete_Multe&amp;diff=9715</id>
		<title>0401 - Pachete Multe</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0401_-_Pachete_Multe&amp;diff=9715"/>
		<updated>2024-03-22T23:54:12Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: Pagină nouă: = Cerinţa = Într-un depozit foarte mare există un raft cu &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; spații de depozitare, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt;. Primele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; spatii de depozitare sunt ocupate cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; pachete numerotate cu valori între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar spațiul de depozitare &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; este gol.  Administratorul depozitului decide mutarea pachetelor, astfel încât pentru orice &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, pachetul numerotat cu &amp;lt;cod...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Într-un depozit foarte mare există un raft cu &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; spații de depozitare, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt;. Primele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; spatii de depozitare sunt ocupate cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; pachete numerotate cu valori între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar spațiul de depozitare &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; este gol.&lt;br /&gt;
&lt;br /&gt;
Administratorul depozitului decide mutarea pachetelor, astfel încât pentru orice &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, pachetul numerotat cu &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; să se afle în spațiul de depozitare &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Pentru aceasta se va folosi spațiul de depozitare suplimentar, &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt;, singura manevră validă fiind mutarea unui pachet dintr-un spațiu de depozitare în altul, cu condiția ca acesta să fie gol.&lt;br /&gt;
&lt;br /&gt;
Determinați o succesiune de manevre prin care fiecare pachet să fie în spațiul corect.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;pachete_multeIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a doua linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale separate prin spaţii. Al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea număr reprezintă numărul pachetului aflat în spațiul de depozitare &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieşire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;pachete_multeOUT.txt&amp;lt;/code&amp;gt; va conţine pe prima linie numărul &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, reprezentând numărul de manevre efectuate. Pe fiecare dintre următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se descrie o manevră, prin două numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația: se ia pachetul din spațiul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și se mută în spațiul &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricţii şi precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100000&amp;lt;/code&amp;gt; &amp;lt;— ATENȚIE AICI&lt;br /&gt;
* pentru fiecare manevră &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt; efectuată, &amp;lt;code&amp;gt;1 ≤ i,j ≤ n+1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;i ≠ j&amp;lt;/code&amp;gt;, iar spațiul &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; trebuie să fie gol&lt;br /&gt;
* numărul de manevre realizate nu trebuie să fie minim&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;pachete_multeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
 2 5 4 3 1 &lt;br /&gt;
&amp;lt;code&amp;gt;pachete_multeOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 1 6&lt;br /&gt;
 5 1&lt;br /&gt;
 2 5&lt;br /&gt;
 6 2&lt;br /&gt;
 3 6&lt;br /&gt;
 4 3&lt;br /&gt;
 6 4&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;pachete_multeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100001&lt;br /&gt;
 2 5 4 3 1 &lt;br /&gt;
&amp;lt;code&amp;gt;pachete_multeOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restricțiile(n, sol):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 100000:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if sol[0][i] &amp;lt; 1 or sol[0][i] &amp;gt; n + 1 or sol[1][i] &amp;lt; 1 or sol[1][i] &amp;gt; n + 1 or sol[0][i] == sol[1][i]:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    INTRARE = &amp;quot;pachete_multeIN.txt&amp;quot;&lt;br /&gt;
    IESIRE = &amp;quot;pachete_multeOUT.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    NMAX = 1000 * 100 + 1&lt;br /&gt;
&lt;br /&gt;
    v = [0] * NMAX&lt;br /&gt;
    p = [0] * NMAX&lt;br /&gt;
    sol = [[0] * (NMAX * 2) for _ in range(2)]&lt;br /&gt;
&lt;br /&gt;
    with open(INTRARE, &#039;r&#039;) as intrare, open(IESIRE, &#039;w&#039;) as iesire:&lt;br /&gt;
        n = int(intrare.readline())&lt;br /&gt;
        data = list(map(int, intrare.readline().split()))&lt;br /&gt;
&lt;br /&gt;
        if len(data) != n:&lt;br /&gt;
            iesire.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            v[i] = data[i - 1]&lt;br /&gt;
            p[data[i - 1]] = i&lt;br /&gt;
&lt;br /&gt;
        p[0] = n + 1&lt;br /&gt;
        nr = 0&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            if v[i] == i:&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            if p[0] != i:&lt;br /&gt;
                nr += 1&lt;br /&gt;
                sol[0][nr] = i&lt;br /&gt;
                sol[1][nr] = p[0]&lt;br /&gt;
                v[p[0]] = v[i]&lt;br /&gt;
                p[v[i]] = p[0]&lt;br /&gt;
                v[i] = 0&lt;br /&gt;
                p[0] = i&lt;br /&gt;
&lt;br /&gt;
            nr += 1&lt;br /&gt;
            sol[0][nr] = p[i]&lt;br /&gt;
            sol[1][nr] = i&lt;br /&gt;
            v[i] = i&lt;br /&gt;
            v[p[i]] = 0&lt;br /&gt;
            p[0] = p[i]&lt;br /&gt;
            p[i] = i&lt;br /&gt;
&lt;br /&gt;
        if not verifica_restricțiile(n, sol):&lt;br /&gt;
            iesire.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        iesire.write(str(nr) + &#039;\n&#039;)&lt;br /&gt;
        for i in range(1, nr + 1):&lt;br /&gt;
            iesire.write(str(sol[0][i]) + &#039; &#039; + str(sol[1][i]) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1220_-_Scadere&amp;diff=9714</id>
		<title>1220 - Scadere</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1220_-_Scadere&amp;diff=9714"/>
		<updated>2024-03-22T23:36:20Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Fie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; un număr natural nenul.&lt;br /&gt;
&lt;br /&gt;
Să considerăm o expresie de forma: &amp;lt;code&amp;gt;x[1]-x[2]-x[3]-...-x[n]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se ştie că scăderea nu este o operaţie asociativă, adică &amp;lt;code&amp;gt;x[1]-(x[2]-x[3])≠(x[1]-x[2])-x[3]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ca urmare, prin plasarea unor perechi de paranteze în expresie, putem obţine diferite valori.&lt;br /&gt;
&lt;br /&gt;
Pentru problema noastră, vom denumi scădere o expresie de forma de mai sus în care pot apărea şi paranteze rotunde care se închid corect. Valoarea unei scăderi se obţine efectuând operaţiile de scădere în ordine de la stânga la dreapta; dacă apar paranteze, se efectuează mai întâi operaţiile din paranteze.&lt;br /&gt;
&lt;br /&gt;
= Cerinţe =&lt;br /&gt;
Date fiind valorile &amp;lt;code&amp;gt;x[1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x[2]&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;x[n]&amp;lt;/code&amp;gt; care intervin în scădere, scrieţi un program care să rezolve următoarele două cerinţe:&lt;br /&gt;
&lt;br /&gt;
# să se determine valoarea maximă a unei scăderi (obţinută prin inserarea convenabilă a unor paranteze rotunde în expresia &amp;lt;code&amp;gt;x[1]-x[2]-x[3]-...-x[n]&amp;lt;/code&amp;gt;), precum şi o scădere având valoare maximă.&lt;br /&gt;
# să se determine valoarea unei scăderi specificate.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;scadereIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie un număr natural &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; indicând cerinţa care trebuie să fie rezolvată (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;). Pe a doua linie este scris numărul natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, care reprezintă numărul de variabile care intervin în scădere. Variabilele sunt 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; în ordinea în care intervin în scădere. Pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii sunt scrise în ordine valorile variabilelor &amp;lt;code&amp;gt;x[1], x[2], ..., x[n]&amp;lt;/code&amp;gt;, câte o valoare pe o linie. Dacă cerinţa este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, fişierul mai conţine o linie pe care este scris un şir de caractere reprezentând o scădere.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;scadereOUT.txt&amp;lt;/code&amp;gt; va conţine pentru &amp;lt;code&amp;gt;c=1&amp;lt;/code&amp;gt; două linii; pe prima linie va fi scris un număr întreg reprezentând valoarea maximă a unei scăderi (obţinută prin inserarea convenabilă a unor paranteze rotunde în expresia &amp;lt;code&amp;gt;x[1]-x[2]-x[3]-...-x[n]&amp;lt;/code&amp;gt;), iar pe a doua linie o scădere având valoare maximă. Dacă &amp;lt;code&amp;gt;c=2&amp;lt;/code&amp;gt; fişierul de ieşire va conţine o singură linie pe care va fi scris un număr întreg reprezentând valoarea scăderii specificate pe ultima linie a fişierului de intrare. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3 ≤ n ≤ 5000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Valorile variabilelor &amp;lt;code&amp;gt;x[1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x[2]&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;x[n]&amp;lt;/code&amp;gt; sunt numere întregi din intervalul &amp;lt;code&amp;gt;[-100, 100]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Scăderea din fişierul de intrare, respectiv scăderea de valoare maximă afişată în fişierul de ieşire vor avea maxim &amp;lt;code&amp;gt;40000&amp;lt;/code&amp;gt; de caractere care pot fi doar cifre, litera mică &amp;lt;code&amp;gt;&#039;x&#039;&amp;lt;/code&amp;gt;, paranteze rotunde şi operatorul &amp;lt;code&amp;gt;&#039;-&#039;&amp;lt;/code&amp;gt; (minus).&lt;br /&gt;
* Pentru teste valorând 50% din punctaj cerinţa va fi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Pentru afişarea corectă a valorii maxime se acordă 40% din punctajul pe test. Punctajul integral se acordă pentru afişarea corectă a valorii maxime şi a unei scăderi de valoare maximă.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;scadereIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 4&lt;br /&gt;
 -7&lt;br /&gt;
 5&lt;br /&gt;
 -10&lt;br /&gt;
 19&lt;br /&gt;
&amp;lt;code&amp;gt;scadereOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 17&lt;br /&gt;
 x1-x2-(x3-x4)&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 =&lt;br /&gt;
&amp;lt;code&amp;gt;scadereIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 4&lt;br /&gt;
 -7&lt;br /&gt;
 5&lt;br /&gt;
 -10&lt;br /&gt;
 19&lt;br /&gt;
 x1-((x2-x3)-x4)&lt;br /&gt;
&amp;lt;code&amp;gt;scadereOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 -3&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Parantezarea care conduce la valoarea maximă este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;x1-x2-(x3-x4) = -7-5-(-10-19) = -12-(-29) = -12+29 = 17&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;x1-((x2-x3)-x4) = -7-((5-10)-19) = -7-(15-19) = -7-(-4) = -7+4 = -3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
&amp;lt;code&amp;gt;scadereIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 -7&lt;br /&gt;
 5&lt;br /&gt;
 -10&lt;br /&gt;
 19&lt;br /&gt;
&amp;lt;code&amp;gt;scadereOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def evaleaza_expresie(s, x):&lt;br /&gt;
    stiva = [float(&#039;inf&#039;)]&lt;br /&gt;
    i = 0&lt;br /&gt;
    while i &amp;lt; len(s):&lt;br /&gt;
        if s[i] == &#039;(&#039;:&lt;br /&gt;
            stiva.append(float(&#039;inf&#039;))&lt;br /&gt;
            i += 1&lt;br /&gt;
        elif s[i] == &#039;)&#039;:&lt;br /&gt;
            if stiva[-2] == float(&#039;inf&#039;):&lt;br /&gt;
                stiva[-2] = stiva[-1]&lt;br /&gt;
            else:&lt;br /&gt;
                stiva[-2] -= stiva[-1]&lt;br /&gt;
            stiva.pop()&lt;br /&gt;
            i += 1&lt;br /&gt;
        else:&lt;br /&gt;
            if s[i] == &#039;-&#039;:&lt;br /&gt;
                i += 1&lt;br /&gt;
            if s[i] == &#039;x&#039;:&lt;br /&gt;
                i += 1&lt;br /&gt;
                nr = 0&lt;br /&gt;
                while &#039;0&#039; &amp;lt;= s[i] &amp;lt;= &#039;9&#039;:&lt;br /&gt;
                    nr = nr * 10 + int(s[i])&lt;br /&gt;
                    i += 1&lt;br /&gt;
                if stiva[-1] == float(&#039;inf&#039;):&lt;br /&gt;
                    stiva[-1] = x[nr - 1]&lt;br /&gt;
                else:&lt;br /&gt;
                    stiva[-1] -= x[nr - 1]&lt;br /&gt;
    return stiva[0]&lt;br /&gt;
&lt;br /&gt;
def citeste_date_intrare(nume_fisier):&lt;br /&gt;
    with open(nume_fisier, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        cerinta = int(fin.readline().strip())&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        x = [int(fin.readline().strip()) for _ in range(n)]&lt;br /&gt;
        s = None&lt;br /&gt;
        if cerinta != 1:&lt;br /&gt;
            s = fin.readline().strip()&lt;br /&gt;
    return cerinta, n, x, s&lt;br /&gt;
&lt;br /&gt;
def scrie_rezultate(nume_fisier, cerinta, x, s=None):&lt;br /&gt;
    with open(nume_fisier, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        if cerinta == 1:&lt;br /&gt;
            rez = x[0] - x[1]&lt;br /&gt;
            for i in range(2, len(x)):&lt;br /&gt;
                if x[i] &amp;gt;= 0:&lt;br /&gt;
                    rez += x[i]&lt;br /&gt;
                else:&lt;br /&gt;
                    rez -= x[i]&lt;br /&gt;
            fout.write(str(rez) + &#039;\n&#039;)&lt;br /&gt;
            fout.write(&amp;quot;x1-&amp;quot;)&lt;br /&gt;
            nr_paranteze = 0&lt;br /&gt;
            for i in range(2, len(x)):&lt;br /&gt;
                if x[i] &amp;gt;= 0:&lt;br /&gt;
                    if nr_paranteze % 2 == 0:&lt;br /&gt;
                        fout.write(&amp;quot;(&amp;quot;)&lt;br /&gt;
                        nr_paranteze += 1&lt;br /&gt;
                else:&lt;br /&gt;
                    if nr_paranteze % 2:&lt;br /&gt;
                        fout.write(&amp;quot;(&amp;quot;)&lt;br /&gt;
                        nr_paranteze += 1&lt;br /&gt;
                fout.write(&amp;quot;x&amp;quot; + str(i - 1) + &amp;quot;-&amp;quot;)&lt;br /&gt;
            fout.write(&amp;quot;x&amp;quot; + str(len(x)) + &amp;quot;&amp;quot;)&lt;br /&gt;
            for i in range(nr_paranteze):&lt;br /&gt;
                fout.write(&amp;quot;)&amp;quot;)&lt;br /&gt;
            fout.write(&#039;\n&#039;)&lt;br /&gt;
        else:&lt;br /&gt;
            rezultat = evaleaza_expresie(s, x)&lt;br /&gt;
            fout.write(str(rezultat) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, x):&lt;br /&gt;
    if not (3 &amp;lt;= n &amp;lt;= 5000):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for val in x:&lt;br /&gt;
        if not (-100 &amp;lt;= val &amp;lt;= 100):&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    nume_intrare = &amp;quot;scadereIN.txt&amp;quot;&lt;br /&gt;
    nume_iesire = &amp;quot;scadereOUT.txt&amp;quot;&lt;br /&gt;
    cerinta, n, x, s = citeste_date_intrare(nume_intrare)&lt;br /&gt;
&lt;br /&gt;
    if not verifica_restrictii(n, x):&lt;br /&gt;
        with open(nume_iesire, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    scrie_rezultate(nume_iesire, cerinta, x, s)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1220_-_Scadere&amp;diff=9713</id>
		<title>1220 - Scadere</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1220_-_Scadere&amp;diff=9713"/>
		<updated>2024-03-22T23:36:04Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Fie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; un număr natural nenul.&lt;br /&gt;
&lt;br /&gt;
Să considerăm o expresie de forma: &amp;lt;code&amp;gt;x[1]-x[2]-x[3]-...-x[n]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se ştie că scăderea nu este o operaţie asociativă, adică &amp;lt;code&amp;gt;x[1]-(x[2]-x[3])≠(x[1]-x[2])-x[3]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ca urmare, prin plasarea unor perechi de paranteze în expresie, putem obţine diferite valori.&lt;br /&gt;
&lt;br /&gt;
Pentru problema noastră, vom denumi scădere o expresie de forma de mai sus în care pot apărea şi paranteze rotunde care se închid corect. Valoarea unei scăderi se obţine efectuând operaţiile de scădere în ordine de la stânga la dreapta; dacă apar paranteze, se efectuează mai întâi operaţiile din paranteze.&lt;br /&gt;
&lt;br /&gt;
= Cerinţe =&lt;br /&gt;
Date fiind valorile &amp;lt;code&amp;gt;x[1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x[2]&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;x[n]&amp;lt;/code&amp;gt; care intervin în scădere, scrieţi un program care să rezolve următoarele două cerinţe:&lt;br /&gt;
&lt;br /&gt;
# să se determine valoarea maximă a unei scăderi (obţinută prin inserarea convenabilă a unor paranteze rotunde în expresia &amp;lt;code&amp;gt;x[1]-x[2]-x[3]-...-x[n]&amp;lt;/code&amp;gt;), precum şi o scădere având valoare maximă.&lt;br /&gt;
# să se determine valoarea unei scăderi specificate.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;scadereIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie un număr natural &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; indicând cerinţa care trebuie să fie rezolvată (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;). Pe a doua linie este scris numărul natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, care reprezintă numărul de variabile care intervin în scădere. Variabilele sunt 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; în ordinea în care intervin în scădere. Pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii sunt scrise în ordine valorile variabilelor &amp;lt;code&amp;gt;x[1], x[2], ..., x[n]&amp;lt;/code&amp;gt;, câte o valoare pe o linie. Dacă cerinţa este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, fişierul mai conţine o linie pe care este scris un şir de caractere reprezentând o scădere.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;scadereOUT.txt&amp;lt;/code&amp;gt; va conţine pentru &amp;lt;code&amp;gt;c=1&amp;lt;/code&amp;gt; două linii; pe prima linie va fi scris un număr întreg reprezentând valoarea maximă a unei scăderi (obţinută prin inserarea convenabilă a unor paranteze rotunde în expresia &amp;lt;code&amp;gt;x[1]-x[2]-x[3]-...-x[n]&amp;lt;/code&amp;gt;), iar pe a doua linie o scădere având valoare maximă. Dacă &amp;lt;code&amp;gt;c=2&amp;lt;/code&amp;gt; fişierul de ieşire va conţine o singură linie pe care va fi scris un număr întreg reprezentând valoarea scăderii specificate pe ultima linie a fişierului de intrare.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3 ≤ n ≤ 5000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Valorile variabilelor &amp;lt;code&amp;gt;x[1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x[2]&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;x[n]&amp;lt;/code&amp;gt; sunt numere întregi din intervalul &amp;lt;code&amp;gt;[-100, 100]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Scăderea din fişierul de intrare, respectiv scăderea de valoare maximă afişată în fişierul de ieşire vor avea maxim &amp;lt;code&amp;gt;40000&amp;lt;/code&amp;gt; de caractere care pot fi doar cifre, litera mică &amp;lt;code&amp;gt;&#039;x&#039;&amp;lt;/code&amp;gt;, paranteze rotunde şi operatorul &amp;lt;code&amp;gt;&#039;-&#039;&amp;lt;/code&amp;gt; (minus).&lt;br /&gt;
* Pentru teste valorând 50% din punctaj cerinţa va fi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Pentru afişarea corectă a valorii maxime se acordă 40% din punctajul pe test. Punctajul integral se acordă pentru afişarea corectă a valorii maxime şi a unei scăderi de valoare maximă.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;scadereIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 4&lt;br /&gt;
 -7&lt;br /&gt;
 5&lt;br /&gt;
 -10&lt;br /&gt;
 19&lt;br /&gt;
&amp;lt;code&amp;gt;scadereOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 17&lt;br /&gt;
 x1-x2-(x3-x4)&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 =&lt;br /&gt;
&amp;lt;code&amp;gt;scadereIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 4&lt;br /&gt;
 -7&lt;br /&gt;
 5&lt;br /&gt;
 -10&lt;br /&gt;
 19&lt;br /&gt;
 x1-((x2-x3)-x4)&lt;br /&gt;
&amp;lt;code&amp;gt;scadereOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 -3&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Parantezarea care conduce la valoarea maximă este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;x1-x2-(x3-x4) = -7-5-(-10-19) = -12-(-29) = -12+29 = 17&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;x1-((x2-x3)-x4) = -7-((5-10)-19) = -7-(15-19) = -7-(-4) = -7+4 = -3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
&amp;lt;code&amp;gt;scadereIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 -7&lt;br /&gt;
 5&lt;br /&gt;
 -10&lt;br /&gt;
 19&lt;br /&gt;
&amp;lt;code&amp;gt;scadereOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def evaleaza_expresie(s, x):&lt;br /&gt;
    stiva = [float(&#039;inf&#039;)]&lt;br /&gt;
    i = 0&lt;br /&gt;
    while i &amp;lt; len(s):&lt;br /&gt;
        if s[i] == &#039;(&#039;:&lt;br /&gt;
            stiva.append(float(&#039;inf&#039;))&lt;br /&gt;
            i += 1&lt;br /&gt;
        elif s[i] == &#039;)&#039;:&lt;br /&gt;
            if stiva[-2] == float(&#039;inf&#039;):&lt;br /&gt;
                stiva[-2] = stiva[-1]&lt;br /&gt;
            else:&lt;br /&gt;
                stiva[-2] -= stiva[-1]&lt;br /&gt;
            stiva.pop()&lt;br /&gt;
            i += 1&lt;br /&gt;
        else:&lt;br /&gt;
            if s[i] == &#039;-&#039;:&lt;br /&gt;
                i += 1&lt;br /&gt;
            if s[i] == &#039;x&#039;:&lt;br /&gt;
                i += 1&lt;br /&gt;
                nr = 0&lt;br /&gt;
                while &#039;0&#039; &amp;lt;= s[i] &amp;lt;= &#039;9&#039;:&lt;br /&gt;
                    nr = nr * 10 + int(s[i])&lt;br /&gt;
                    i += 1&lt;br /&gt;
                if stiva[-1] == float(&#039;inf&#039;):&lt;br /&gt;
                    stiva[-1] = x[nr - 1]&lt;br /&gt;
                else:&lt;br /&gt;
                    stiva[-1] -= x[nr - 1]&lt;br /&gt;
    return stiva[0]&lt;br /&gt;
&lt;br /&gt;
def citeste_date_intrare(nume_fisier):&lt;br /&gt;
    with open(nume_fisier, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        cerinta = int(fin.readline().strip())&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        x = [int(fin.readline().strip()) for _ in range(n)]&lt;br /&gt;
        s = None&lt;br /&gt;
        if cerinta != 1:&lt;br /&gt;
            s = fin.readline().strip()&lt;br /&gt;
    return cerinta, n, x, s&lt;br /&gt;
&lt;br /&gt;
def scrie_rezultate(nume_fisier, cerinta, x, s=None):&lt;br /&gt;
    with open(nume_fisier, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        if cerinta == 1:&lt;br /&gt;
            rez = x[0] - x[1]&lt;br /&gt;
            for i in range(2, len(x)):&lt;br /&gt;
                if x[i] &amp;gt;= 0:&lt;br /&gt;
                    rez += x[i]&lt;br /&gt;
                else:&lt;br /&gt;
                    rez -= x[i]&lt;br /&gt;
            fout.write(str(rez) + &#039;\n&#039;)&lt;br /&gt;
            fout.write(&amp;quot;x1-&amp;quot;)&lt;br /&gt;
            nr_paranteze = 0&lt;br /&gt;
            for i in range(2, len(x)):&lt;br /&gt;
                if x[i] &amp;gt;= 0:&lt;br /&gt;
                    if nr_paranteze % 2 == 0:&lt;br /&gt;
                        fout.write(&amp;quot;(&amp;quot;)&lt;br /&gt;
                        nr_paranteze += 1&lt;br /&gt;
                else:&lt;br /&gt;
                    if nr_paranteze % 2:&lt;br /&gt;
                        fout.write(&amp;quot;(&amp;quot;)&lt;br /&gt;
                        nr_paranteze += 1&lt;br /&gt;
                fout.write(&amp;quot;x&amp;quot; + str(i - 1) + &amp;quot;-&amp;quot;)&lt;br /&gt;
            fout.write(&amp;quot;x&amp;quot; + str(len(x)) + &amp;quot;&amp;quot;)&lt;br /&gt;
            for i in range(nr_paranteze):&lt;br /&gt;
                fout.write(&amp;quot;)&amp;quot;)&lt;br /&gt;
            fout.write(&#039;\n&#039;)&lt;br /&gt;
        else:&lt;br /&gt;
            rezultat = evaleaza_expresie(s, x)&lt;br /&gt;
            fout.write(str(rezultat) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, x):&lt;br /&gt;
    if not (3 &amp;lt;= n &amp;lt;= 5000):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for val in x:&lt;br /&gt;
        if not (-100 &amp;lt;= val &amp;lt;= 100):&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    nume_intrare = &amp;quot;scadereIN.txt&amp;quot;&lt;br /&gt;
    nume_iesire = &amp;quot;scadereOUT.txt&amp;quot;&lt;br /&gt;
    cerinta, n, x, s = citeste_date_intrare(nume_intrare)&lt;br /&gt;
&lt;br /&gt;
    if not verifica_restrictii(n, x):&lt;br /&gt;
        with open(nume_iesire, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    scrie_rezultate(nume_iesire, cerinta, x, s)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2194_-_identice3&amp;diff=9712</id>
		<title>2194 - identice3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2194_-_identice3&amp;diff=9712"/>
		<updated>2024-03-22T23:23:37Z</updated>

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

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Dexter și-a definit propriul algoritm de arhivare a șirului favorit &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;, șir format numai din litere mici ale alfabetului englez. Șirul arhivat, notat cu &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, poate fi format din cifre, litere mici ale alfabetului englez, parantezele drepte &amp;lt;code&amp;gt;&#039;[&#039;&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;&#039;]&#039;&amp;lt;/code&amp;gt; și parantezele rotunde &amp;lt;code&amp;gt;&#039;(&#039;&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;&#039;)&#039;&amp;lt;/code&amp;gt;, precum și caractere &amp;lt;code&amp;gt;&#039;*&#039;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Fixi, curios din fire, descoperă algoritmul și încearcă să dezarhiveze șirul &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, prin efectuarea unor transformări repetate. O transformare poate fi de unul dintre cele &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; tipuri de mai jos, unde s-a notat cu &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; o secvență din &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; formată numai din litere.&lt;br /&gt;
&lt;br /&gt;
# O secvență a lui &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; de forma &amp;lt;code&amp;gt;n(C)&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; este numărul natural poziționat imediat înaintea parantezei rotunde, se transformă într-o secvență &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; obținută prin scrierea concatenată, de &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; ori, a șirului &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;. Exemplu: pentru secvența &amp;lt;code&amp;gt;10(ab)&amp;lt;/code&amp;gt; avem &amp;lt;code&amp;gt;n=10&amp;lt;/code&amp;gt; și se obține secvența &amp;lt;code&amp;gt;D=abababababababababab&amp;lt;/code&amp;gt;.&lt;br /&gt;
# O secvență a lui &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; de forma &amp;lt;code&amp;gt;[*C]&amp;lt;/code&amp;gt; se transformă într-o secvență palindromică de lungime pară, obținută prin concatenarea secvenței &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; cu oglinditul lui &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;. Exemplu: din secvența &amp;lt;code&amp;gt;[*abc]&amp;lt;/code&amp;gt; se obține secvența palindromică de lungime pară &amp;lt;code&amp;gt;abccba&amp;lt;/code&amp;gt;&lt;br /&gt;
# O secvență a lui &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; de forma &amp;lt;code&amp;gt;[C*]&amp;lt;/code&amp;gt; se transformă într-o secvență palindromică de lungime impară, obținută prin concatenarea secvenței &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; cu oglinditul lui &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; din care s-a eliminat primul caracter. Exemplu: din secvența &amp;lt;code&amp;gt;[abc*]&amp;lt;/code&amp;gt; se obține secvența palindromică de lungime impară &amp;lt;code&amp;gt;abcba&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Un șir se consideră dezarhivat dacă este format numai din litere mici ale alfabetului englez.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Fiind dat șirul arhivat &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; să se determine numărul de transformări, de cele &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; tipuri de mai sus, realizate de Fixi în cadrul algoritmului de dezarhivare, precum și forma finală dezarhivată &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; a șirului &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;arhIN.txt&amp;lt;/code&amp;gt; conține șirul de caractere arhivat &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;arhOUT.txt&amp;lt;/code&amp;gt; va conține obligatoriu două linii. Pe prima linie numărul de transformări cerut, iar pe linia a doua șirul de caractere cerut, &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt;&amp;lt;/code&amp;gt; lungimea șirului arhivat &amp;lt;code&amp;gt;S ≤ 10000&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;0 &amp;lt;&amp;lt;/code&amp;gt; lungimea șirului dezarhivat &amp;lt;code&amp;gt;T ≤ 100000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 &amp;lt; n ≤ 1000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* O secvență a unui șir este o succesiune de caractere aflate pe poziții consecutive în şir;&lt;br /&gt;
* În șirul &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; o cifră poate apărea numai imediat înaintea unei paranteze rotunde deschise sau imediat înaintea unei alte cifre; fiecare paranteză rotundă deschisă are imediat înaintea sa cel puțin o cifră; toate parantezele, drepte sau rotunde, se închid corect. Caracterul &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; poate apărea numai imediat după o paranteză dreaptă deschisă sau imediat înaintea unei paranteze drepte închise;&lt;br /&gt;
* O secvenţă a unui șir este palindromică dacă primul element al secvenţei este egal cu ultimul, al doilea cu penultimul etc; oglinditul unei secvențe se obține prin scriere în ordine inversă a caracterelor sale;&lt;br /&gt;
* Se acordă 20% din punctajul fiecărui test pentru scrierea corectă a numărului cerut și 80% din punctajul fiecărui test pentru scrierea corectă a șirului cerut;&lt;br /&gt;
* Pentru 30 de puncte șirul arhivat &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; poate fi dezarhivat numai cu transformări de tipul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Pentru alte 30 de puncte șirul arhivat &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; poate fi dezarhivat numai cu transformări de tipurile &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;.&lt;br /&gt;
* În concurs s-au acordat 10 puncte din oficiu. Pe site se acordă 10 puncte pentru exemple.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;arhIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2(a)[*a2(b)]xy[2(c)b*]d&lt;br /&gt;
&amp;lt;code&amp;gt;arhOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
 aaabbbbaxyccbccd&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
&amp;lt;code&amp;gt;2(a)&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;aa&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2(b)&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;bb&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[*a2(b)]&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;[*abb]&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;abbbba&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2(c)&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[2(c)b*]&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;[ccb*]&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;ccbcc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 =&lt;br /&gt;
&amp;lt;code&amp;gt;arhIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2(ab[cd*])a3(xyz)&lt;br /&gt;
&amp;lt;code&amp;gt;arhOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 abcdcabcdcaxyzxyzxyz&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
&amp;lt;code&amp;gt;3(xyz)&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;xyzxyzxyz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[cd*]&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;cdc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2(ab[cd*])&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;2(abcdc)&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;abcdcabcdc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3 ==&lt;br /&gt;
&amp;lt;code&amp;gt;arhIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001(a)[*a2(b)]xy[2(c)b*]d&lt;br /&gt;
&amp;lt;code&amp;gt;arhOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
fin = None&lt;br /&gt;
fout = None&lt;br /&gt;
s = &amp;quot;&amp;quot;&lt;br /&gt;
transf = 0&lt;br /&gt;
p = 0&lt;br /&gt;
&lt;br /&gt;
def repeatOp():&lt;br /&gt;
    global p, transf&lt;br /&gt;
    transf += 1&lt;br /&gt;
    ori = 0&lt;br /&gt;
    while p &amp;lt; len(s) and s[p].isdigit():&lt;br /&gt;
        ori = ori * 10 + int(s[p])&lt;br /&gt;
        p += 1&lt;br /&gt;
&lt;br /&gt;
    p += 1  # sar peste &#039;(&#039;&lt;br /&gt;
    ans, deRepetat = &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    while s[p] != &#039;)&#039;:&lt;br /&gt;
        deRepetat += termen()&lt;br /&gt;
    p += 1  # sar peste &#039;)&#039;&lt;br /&gt;
    &lt;br /&gt;
    while ori &amp;gt; 0:&lt;br /&gt;
        ans += deRepetat&lt;br /&gt;
        ori -= 1&lt;br /&gt;
&lt;br /&gt;
    return ans&lt;br /&gt;
&lt;br /&gt;
def palParOp():&lt;br /&gt;
    global p, transf&lt;br /&gt;
    transf += 1&lt;br /&gt;
    p += 2  # sar peste &#039;[*&#039;&lt;br /&gt;
    ans = &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    while s[p] != &#039;]&#039;:&lt;br /&gt;
        ans += termen()&lt;br /&gt;
        &lt;br /&gt;
    for i in range(len(ans) - 1, -1, -1):&lt;br /&gt;
        ans += ans[i]&lt;br /&gt;
    p += 1  # sar peste &#039;]&#039;&lt;br /&gt;
    &lt;br /&gt;
    return ans&lt;br /&gt;
&lt;br /&gt;
def palImpOp():&lt;br /&gt;
    global p, transf&lt;br /&gt;
    transf += 1&lt;br /&gt;
    p += 1  # sar peste &#039;[&#039;&lt;br /&gt;
    ans = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    while s[p] != &#039;*&#039;:&lt;br /&gt;
        ans += termen()&lt;br /&gt;
    &lt;br /&gt;
    for i in range(len(ans) - 2, -1, -1):&lt;br /&gt;
        ans += ans[i]&lt;br /&gt;
    p += 2  # sar peste &#039;*]&#039;&lt;br /&gt;
    &lt;br /&gt;
    return ans&lt;br /&gt;
&lt;br /&gt;
def termen():&lt;br /&gt;
    global p&lt;br /&gt;
    ans = &amp;quot;&amp;quot;&lt;br /&gt;
    if s[p].isdigit():&lt;br /&gt;
        ans = repeatOp()&lt;br /&gt;
    elif s[p] == &#039;[&#039; and s[p + 1] == &#039;*&#039;:&lt;br /&gt;
        ans = palParOp()&lt;br /&gt;
    elif s[p] == &#039;[&#039;:&lt;br /&gt;
        ans = palImpOp()&lt;br /&gt;
    elif s[p].isalpha():&lt;br /&gt;
        ans = s[p]&lt;br /&gt;
        p += 1&lt;br /&gt;
&lt;br /&gt;
    return ans&lt;br /&gt;
&lt;br /&gt;
def eval():&lt;br /&gt;
    ans = &amp;quot;&amp;quot;&lt;br /&gt;
    while p &amp;lt; len(s):&lt;br /&gt;
        ans += termen()&lt;br /&gt;
    &lt;br /&gt;
    return ans&lt;br /&gt;
&lt;br /&gt;
def check_constraints(s, n):&lt;br /&gt;
    if not (0 &amp;lt; len(s) &amp;lt;= 10000 and 1 &amp;lt; n &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global s&lt;br /&gt;
    with open(&amp;quot;arhIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        s = fin.readline().strip()&lt;br /&gt;
&lt;br /&gt;
    # Extragem n din șirul arhivat&lt;br /&gt;
    if &#039;(&#039; in s:&lt;br /&gt;
        n = int(s.split(&#039;(&#039;)[0])&lt;br /&gt;
    else:&lt;br /&gt;
        with open(&amp;quot;arhOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if not check_constraints(s, n):&lt;br /&gt;
        with open(&amp;quot;arhOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    ans = eval()&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;arhOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{transf}\n{ans}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3453_-_jungla&amp;diff=9710</id>
		<title>3453 - jungla</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3453_-_jungla&amp;diff=9710"/>
		<updated>2024-03-22T22:28:31Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
În junglă cresc foarte mulți copaci, de diferite înălțimi. Fiind pasionat de copacii din junglă, Gigel a notat pe o foaie înălțimile la care pot ajunge copacii din junglă. Fiind închis în casă, își pune, ca orice copil normal, tot felul de întrebări bizare. El s-a gandit să planteze pomii în linie, într-o anumită ordine, și astfel a obținut &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere, &amp;lt;code&amp;gt;v[1], v[2], ..., v[N]&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;V[i]&amp;lt;/code&amp;gt; reprezintă înălțimea copacului &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Apoi i-au venit în minte două întrebări.&lt;br /&gt;
&lt;br /&gt;
Mai întâi vrea sa afle câți copaci plantați înaintea copacului cu numărul de ordine &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; au înălțimile mai mici ca acesta.&lt;br /&gt;
&lt;br /&gt;
A doua întrebare este mai speciala; Gigel se întreabă care ar fi dreptunghiul cu suprafața maximă liberă (adică neocupată de vreun copac) dacă ar încadra copacii într-o seră cu înălțimea egală cu înălțimea celui mai înalt copac plantat. Putem vizualiza sera ca pe un tablou bidimensional, cu colțul din stanga jos de coordonate &amp;lt;code&amp;gt;(1,1)&amp;lt;/code&amp;gt; , iar cel din dreapta sus de coordonate &amp;lt;code&amp;gt;(N,H)&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; este numărul de copaci, iar &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; este înâlțimea maximă a unui copac. În acest tablou copacul cu numărul de ordine &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; ocupă primele &amp;lt;code&amp;gt;v[i]&amp;lt;/code&amp;gt; unități de pe coloana &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, de jos in sus (&amp;lt;code&amp;gt;v[i]&amp;lt;/code&amp;gt; reprezintă înălțimea copacului &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură un număr &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, care poate avea valorile &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, în funcție de cerința problemei.&lt;br /&gt;
&lt;br /&gt;
Pentru &amp;lt;code&amp;gt;p = 1&amp;lt;/code&amp;gt;, următorul rând conține numerele &amp;lt;code&amp;gt;N q&amp;lt;/code&amp;gt;. Următorul rând conține &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; valori, a &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; -a valoare reprezentând înălțimea copacului cu numarul de ordine. Rândul următor conține &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; numere; pentru fiecare număr &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; se cere numarul de copaci plantați înaintea copacului cu numărul de ordine &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; cu înălțimi mai mici ca acesta.&lt;br /&gt;
&lt;br /&gt;
Pentru &amp;lt;code&amp;gt;p = 2&amp;lt;/code&amp;gt;, următorul rând va conține doar numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, iar ultimul rând va conține &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; valori reprezentând înălțimile copacilor.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Pentru &amp;lt;code&amp;gt;p = 1&amp;lt;/code&amp;gt; programul va afișa &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; linii; pe fiecare linie se va afla raspunsul pentru fiecare dintre cele &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; numere date.&lt;br /&gt;
&lt;br /&gt;
Pentru &amp;lt;code&amp;gt;p = 2&amp;lt;/code&amp;gt; programul fa afișa singur numar, reprezentând raspunsul pentru cerinta &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; , adică dreptunghiul liber de arie maximă.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* Pentru cerința 1, &amp;lt;code&amp;gt;n ≤ 1000&amp;lt;/code&amp;gt;, iar pentru cerința 2, &amp;lt;code&amp;gt;n ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* înâlțimile copacilor vor fi numere naturale nenule mi mici decât &amp;lt;code&amp;gt;15.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ q ≤ 2*n&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 25 de puncte cerința este 1.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 1&lt;br /&gt;
 7 3&lt;br /&gt;
 4 2 6 8 3 4 2&lt;br /&gt;
 2 4 6&lt;br /&gt;
Ieșire&lt;br /&gt;
 0&lt;br /&gt;
 3&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 2&lt;br /&gt;
 11&lt;br /&gt;
 4 6 5 4 6 8 8 10 6 3 2&lt;br /&gt;
Ieșire&lt;br /&gt;
 20&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Pentru exemplul 1: &amp;lt;code&amp;gt;p=1&amp;lt;/code&amp;gt; deci se rezolvă doar cerința 1. Inainte de copacul cu numărul de ordine &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; nu există copaci cu înalțimi mai mici, înainte de copacul cu numărul de ordine &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; există &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; copaci mai mici, iar înainte de copacul &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; există &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; copaci mai mici.&lt;br /&gt;
&lt;br /&gt;
Pentru exemplul 2, sera ar arăta astfel:&lt;br /&gt;
 o o o o o o o 1 o o&lt;br /&gt;
 o o o o o o o 1 o o&lt;br /&gt;
 o o o o o 1 1 1 o o&lt;br /&gt;
 o o o o o 1 1 1 o o&lt;br /&gt;
 o 1 o o 1 1 1 1 o o&lt;br /&gt;
 o 1 1 o 1 1 1 1 o o&lt;br /&gt;
 1 1 1 1 1 1 1 1 o o&lt;br /&gt;
 1 1 1 1 1 1 1 1 1 o&lt;br /&gt;
 1 1 1 1 1 1 1 1 1 1&lt;br /&gt;
 1 1 1 1 1 1 1 1 1 1&lt;br /&gt;
Unde &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt; reprezinta zona liberă, iar &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; reprezintă o zona ocupată de copac. Suprafața dreptunghiulară maximă este de &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; de unități.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: ==&lt;br /&gt;
Intrare&lt;br /&gt;
 2&lt;br /&gt;
 123123213&lt;br /&gt;
Ieșire&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restricții(cer, n, q=None, v=None):&lt;br /&gt;
    if v and any(h &amp;lt;= 0 or h &amp;gt;= 15000 for h in v):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    &lt;br /&gt;
    if cer == 1:&lt;br /&gt;
        if not (1 &amp;lt;= n &amp;lt;= 1000) or not (1 &amp;lt;= q &amp;lt;= 2*n):&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    elif cer == 2:&lt;br /&gt;
        if not (1 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Cerința specificată este invalidă.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    cer = int(input())&lt;br /&gt;
    if cer == 1:&lt;br /&gt;
        n, q = map(int, input().split())&lt;br /&gt;
        if not verifica_restricții(cer, n, q):&lt;br /&gt;
            return&lt;br /&gt;
        v = [0] + list(map(int, input().split()))&lt;br /&gt;
        queries = list(map(int, input().split()))&lt;br /&gt;
        for j in queries:&lt;br /&gt;
            copaci = 0&lt;br /&gt;
            for i in range(1, j):&lt;br /&gt;
                if v[i] &amp;lt; v[j]:&lt;br /&gt;
                    copaci += 1&lt;br /&gt;
            print(copaci)&lt;br /&gt;
    elif cer == 2:&lt;br /&gt;
        n = int(input())&lt;br /&gt;
        if not verifica_restricții(cer, n):&lt;br /&gt;
            return&lt;br /&gt;
        v = [0] + list(map(int, input().split()))&lt;br /&gt;
        max_height = max(v)&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            v[i] = max_height - v[i]&lt;br /&gt;
        st = [0] * (n + 1)&lt;br /&gt;
        dr = [0] * (n + 1)&lt;br /&gt;
        stack = []&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            while stack and v[stack[-1]] &amp;gt;= v[i]:&lt;br /&gt;
                stack.pop()&lt;br /&gt;
            st[i] = stack[-1] if stack else 0&lt;br /&gt;
            stack.append(i)&lt;br /&gt;
        stack = []&lt;br /&gt;
        for i in range(n, 0, -1):&lt;br /&gt;
            while stack and v[stack[-1]] &amp;gt;= v[i]:&lt;br /&gt;
                stack.pop()&lt;br /&gt;
            dr[i] = stack[-1] if stack else n + 1&lt;br /&gt;
            stack.append(i)&lt;br /&gt;
        arie_max = 0&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            arie_max = max(arie_max, v[i] * (dr[i] - st[i] - 1))&lt;br /&gt;
        print(arie_max)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3705_-_rectangles&amp;diff=9709</id>
		<title>3705 - rectangles</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3705_-_rectangles&amp;diff=9709"/>
		<updated>2024-03-22T22:15:08Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinta ==&lt;br /&gt;
&lt;br /&gt;
Se consideră un șir de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale. Numim rectangle-sequence orice secvență continuă din șir (formată din elemente situate pe poziții consecutive) care conține cel puțin două elemente. Fiecare rectangle-sequence este caracterizată de un dreptunghi cu lungimile laturilor egale cu cele mai mari două elemente din cadrul ei.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se calculeze restul împărțirii sumei ariilor dreptunghiurilor ce caracterizează toate rectangle-sequences din șir la numărul &amp;lt;code&amp;gt;1.000.000.007&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Prima linie contine numărul natural nenul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, reprezentând numărul elementelor din șir, iar linia a doua conține, separate prin câte un spațiu, cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; elemente. Întrucât volumul datelor de intrare este foarte mare, vă recomandăm, în cazul în care folosiți pentru citire biblioteca &amp;lt;code&amp;gt;iostream&amp;lt;/code&amp;gt; din standardul C++, să adaugați la începutul funcției &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; urmatoarele instrucțiuni:&lt;br /&gt;
 std :: iosbase :: sync_with_stdio (false);&lt;br /&gt;
 std :: cin.tie(0);&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Ieșirea conține numărul de determinat, modulo &amp;lt;code&amp;gt;1.000.000.007&amp;lt;/code&amp;gt;. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ orice element din șir 1 ≤ 1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Subtask 1 (13 puncte): &amp;lt;code&amp;gt;N ≤ 2000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Subtask 2 (23 puncte): &amp;lt;code&amp;gt;N ≤ 100.000&amp;lt;/code&amp;gt; și există cel mult &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; de numere distincte în șir.&lt;br /&gt;
* Subtask 3 (27 puncte): &amp;lt;code&amp;gt;N ≤ 200.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Subtask 4 (37 puncte): nu există restricții suplimentare&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 3&lt;br /&gt;
 2 3 1&lt;br /&gt;
Ieșire&lt;br /&gt;
 15&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Sunt &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; rectangle-sequences: &amp;lt;code&amp;gt;(2; 3)&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;(2; 3; 1)&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;(3; 1)&amp;lt;/code&amp;gt;. Ariile celor trei deptunghiuri ce le caracterizează sunt: &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
Intrare&lt;br /&gt;
 100000000000&lt;br /&gt;
 2 3 1&lt;br /&gt;
Ieșire&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MaxN = 1000010&lt;br /&gt;
mod = 10**9 + 7&lt;br /&gt;
&lt;br /&gt;
v = [0] * MaxN&lt;br /&gt;
left1 = [0] * MaxN&lt;br /&gt;
left2 = [0] * MaxN&lt;br /&gt;
right1 = [0] * MaxN&lt;br /&gt;
right2 = [0] * MaxN&lt;br /&gt;
&lt;br /&gt;
def multiply(a, b, c, d):&lt;br /&gt;
    return ((a * b) % mod) * ((c * d) % mod) % mod&lt;br /&gt;
&lt;br /&gt;
def citeste_si_verifica_elemente(n):&lt;br /&gt;
    print(f&amp;quot;Introduceți {n} elemente (fiecare urmat de Enter):&amp;quot;)&lt;br /&gt;
    v_temp = []&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        try:&lt;br /&gt;
            x = int(input(f&amp;quot;Elementul {i}: &amp;quot;))&lt;br /&gt;
            if not (1 &amp;lt;= x &amp;lt;= 10**9):&lt;br /&gt;
                print(&amp;quot;Datele nu corespund restricțiilor impuse&amp;quot;)&lt;br /&gt;
                return None&lt;br /&gt;
            v_temp.append(x)&lt;br /&gt;
        except ValueError:&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse&amp;quot;)&lt;br /&gt;
            return None&lt;br /&gt;
    return v_temp&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        n = int(input(&amp;quot;Introduceți lungimea șirului: &amp;quot;))&lt;br /&gt;
        if not (1 &amp;lt;= n &amp;lt;= 10**6):&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    v_input = citeste_si_verifica_elemente(n)&lt;br /&gt;
    if v_input is None:&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    v[1:n+1] = v_input&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n+1):&lt;br /&gt;
        left1[i] = left2[i] = 0&lt;br /&gt;
        right1[i] = right2[i] = n + 1&lt;br /&gt;
    &lt;br /&gt;
    st1, st2, aux = [], [], []&lt;br /&gt;
    for i in range(1, n+1):&lt;br /&gt;
        while st2 and v[i] &amp;gt; v[st2[-1]]:&lt;br /&gt;
            right2[st2[-1]] = i&lt;br /&gt;
            st2.pop()&lt;br /&gt;
        while st1 and v[i] &amp;gt; v[st1[-1]]:&lt;br /&gt;
            right1[st1[-1]] = i&lt;br /&gt;
            aux.append(st1.pop())&lt;br /&gt;
        st1.append(i)&lt;br /&gt;
        while aux:&lt;br /&gt;
            st2.append(aux.pop())&lt;br /&gt;
    &lt;br /&gt;
    st1.clear()&lt;br /&gt;
    st2.clear()&lt;br /&gt;
    &lt;br /&gt;
    for i in range(n, 0, -1):&lt;br /&gt;
        while st2 and v[i] &amp;gt;= v[st2[-1]]:&lt;br /&gt;
            left2[st2[-1]] = i&lt;br /&gt;
            st2.pop()&lt;br /&gt;
        while st1 and v[i] &amp;gt;= v[st1[-1]]:&lt;br /&gt;
            left1[st1[-1]] = i&lt;br /&gt;
            aux.append(st1.pop())&lt;br /&gt;
        st1.append(i)&lt;br /&gt;
        while aux:&lt;br /&gt;
            st2.append(aux.pop())&lt;br /&gt;
    &lt;br /&gt;
    sol = 0&lt;br /&gt;
    for i in range(1, n+1):&lt;br /&gt;
        if left1[i] &amp;gt; 0:&lt;br /&gt;
            a = left1[i] - left2[i]&lt;br /&gt;
            b = right1[i] - i&lt;br /&gt;
            sol += multiply(a, b, v[i], v[left1[i]])&lt;br /&gt;
        if right1[i] &amp;lt; n + 1:&lt;br /&gt;
            a = i - left1[i]&lt;br /&gt;
            b = right2[i] - right1[i]&lt;br /&gt;
            sol += multiply(a, b, v[i], v[right1[i]])&lt;br /&gt;
    &lt;br /&gt;
    sol %= mod&lt;br /&gt;
    print(sol)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3692_-_maxime&amp;diff=9708</id>
		<title>3692 - maxime</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3692_-_maxime&amp;diff=9708"/>
		<updated>2024-03-22T22:07:25Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinta ==&lt;br /&gt;
&lt;br /&gt;
Se dă un șir &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; valori naturale nenule, memorate pe poziții consecutive începând cu poziția &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Notăm cu &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; următoarea secvență de cod aplicată asupra sa:&lt;br /&gt;
&lt;br /&gt;
(C/C++)&lt;br /&gt;
 maxim = 0;&lt;br /&gt;
 rep = 0;&lt;br /&gt;
 for(i = 1; i &amp;lt;= N; i++)&lt;br /&gt;
 	if(V[i] &amp;gt; maxim)&lt;br /&gt;
 		maxim = V[i];&lt;br /&gt;
 	else&lt;br /&gt;
 		if(V[i] == maxim)&lt;br /&gt;
 			rep++;&lt;br /&gt;
Considerăm operația de eliminare din &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; a elementului de pe o anumită poziție dată &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;. În urma operației de eliminare elementele de pe pozițiile &amp;lt;code&amp;gt;P + 1, P + 2, ..., N&amp;lt;/code&amp;gt; ajung pe o poziție cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; mai mică iar &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; scade cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dându-se mai multe operații de eliminare(independente una de alta, adică fiecare se aplică asupra șirului inițial, nu după operația anterioară), să se determine valoarea variabilei &amp;lt;code&amp;gt;rep&amp;lt;/code&amp;gt; dacă am aplica secvența &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; asupra șirului obținut după fiecare operație de eliminare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fițierul &amp;lt;code&amp;gt;maximeIN.txt&amp;lt;/code&amp;gt; conține pe prima linie un număr natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Pe linia a doua se află &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale nenule, separate prin câte un spațiu. Pe linia următoare se află un număr &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; reprezentând numărul de operații de eliminare. Linia următoare conține &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; numere, cuprinse între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, ce reprezină poziția din șir a elementului la care se realizează eliminarea curentă. Numerele de pe această linie sunt separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul &amp;lt;code&amp;gt;maximeOUT.txt&amp;lt;/code&amp;gt; conține pe primul rând &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; numere, separate prin câte un spațiu, reprezentând valoarea variabilei &amp;lt;code&amp;gt;rep&amp;lt;/code&amp;gt; obținută aplicând secvența &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; după fiecare operație de eliminare. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ N ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Vi&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ poziție eliminare ≤ N&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;maximeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
 3 1 3 8 1 8&lt;br /&gt;
 3&lt;br /&gt;
 2 5 6&lt;br /&gt;
&amp;lt;code&amp;gt;maximeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 2 1&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Aplicând prima operație de eliminare, șirul devine: &amp;lt;code&amp;gt;N = 5&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;V = 3 3 8 1 8&amp;lt;/code&amp;gt;, valoarea &amp;lt;code&amp;gt;rep&amp;lt;/code&amp;gt; devine &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicând a doua operație de eliminare, șirul devine: &amp;lt;code&amp;gt;N = 5&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;V = 3 1 3 8 8&amp;lt;/code&amp;gt;, valoarea &amp;lt;code&amp;gt;rep&amp;lt;/code&amp;gt; devine &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicând a treia operație de eliminare, șirul devine: &amp;lt;code&amp;gt;N = 5&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;V = 3 1 3 8 1&amp;lt;/code&amp;gt;, valoarea &amp;lt;code&amp;gt;rep&amp;lt;/code&amp;gt; devine &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;maximeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100001&lt;br /&gt;
 3 1 3 8 1 8&lt;br /&gt;
 3&lt;br /&gt;
 2 5 6&lt;br /&gt;
&amp;lt;code&amp;gt;maximeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot; def=&amp;quot;&amp;quot; calculeaza_rep(v):=&amp;quot;&amp;quot; maxim=&amp;quot;0&amp;quot; rep=&amp;quot;0&amp;quot; for=&amp;quot;&amp;quot; val=&amp;quot;&amp;quot; in=&amp;quot;&amp;quot; v:=&amp;quot;&amp;quot; if=&amp;quot;&amp;quot;&amp;gt; NMAX = 100005&lt;br /&gt;
&lt;br /&gt;
def verifica_restricții(n, a, m, queries):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifică dacă datele de intrare respectă restricțiile impuse.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if not (2 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if any(v &amp;lt; 1 or v &amp;gt; 100000 for v in a):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= m &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if any(p &amp;lt; 1 or p &amp;gt; n for p in queries):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;maximeIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;maximeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        a = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
        m = int(fin.readline().strip())&lt;br /&gt;
        queries = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
        if not verifica_restricții(n, a, m, queries):&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        premaxim = maxim = -1&lt;br /&gt;
        pozpremaxim = pozmaxim = -1&lt;br /&gt;
        rep = varf = 0&lt;br /&gt;
        CNT = [0] * (NMAX + 2)&lt;br /&gt;
        PZ = [0] * (NMAX + 2)&lt;br /&gt;
        st = [0] * (NMAX + 2)&lt;br /&gt;
        DR = [0] * (NMAX + 2)&lt;br /&gt;
        OK = [0] * (NMAX + 2)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            if a[i-1] &amp;gt; maxim:&lt;br /&gt;
                premaxim, pozpremaxim = maxim, pozmaxim&lt;br /&gt;
                maxim, pozmaxim = a[i-1], i&lt;br /&gt;
                if pozpremaxim &amp;gt;= 1:&lt;br /&gt;
                    PZ[pozpremaxim] = i&lt;br /&gt;
                PZ[pozmaxim] = -1&lt;br /&gt;
                CNT[i] = 1&lt;br /&gt;
            else:&lt;br /&gt;
                while varf &amp;gt; 0 and a[i-1] &amp;gt; a[st[varf]-1]:&lt;br /&gt;
                    varf -= 1&lt;br /&gt;
                if pozmaxim &amp;gt;= 1 and PZ[pozmaxim] == 0 and a[i-1] &amp;gt;= premaxim:&lt;br /&gt;
                    PZ[pozmaxim] = i&lt;br /&gt;
                    if a[i-1] == premaxim:&lt;br /&gt;
                        OK[pozmaxim] = 1&lt;br /&gt;
                if a[i-1] == maxim:&lt;br /&gt;
                    CNT[i] = 2&lt;br /&gt;
                    rep += 1&lt;br /&gt;
&lt;br /&gt;
            st[varf + 1] = i&lt;br /&gt;
            varf += 1&lt;br /&gt;
&lt;br /&gt;
        for i in range(n, 0, -1):&lt;br /&gt;
            while varf &amp;gt; 0 and a[i-1] &amp;gt; a[st[varf]-1]:&lt;br /&gt;
                varf -= 1&lt;br /&gt;
            DR[i] = 1 + DR[st[varf]] if a[i-1] == a[st[varf]-1] else DR[st[varf]]&lt;br /&gt;
            st[varf + 1] = i&lt;br /&gt;
            varf += 1&lt;br /&gt;
&lt;br /&gt;
        for p in queries:&lt;br /&gt;
            if CNT[p] == 0:&lt;br /&gt;
                fout.write(f&amp;quot;{rep} &amp;quot;)&lt;br /&gt;
            elif CNT[p] == 2:&lt;br /&gt;
                fout.write(f&amp;quot;{rep - 1} &amp;quot;)&lt;br /&gt;
            elif CNT[p] == 1:&lt;br /&gt;
                if OK[p]:&lt;br /&gt;
                    fout.write(f&amp;quot;{1 + rep - DR[p] + DR[PZ[p]]} &amp;quot;)&lt;br /&gt;
                else:&lt;br /&gt;
                    fout.write(f&amp;quot;{rep - DR[p] + DR[PZ[p]]} &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;\n&amp;quot;)  # Scriem un newline la sfârșit pentru a încheia output-ul&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3692_-_maxime&amp;diff=9707</id>
		<title>3692 - maxime</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3692_-_maxime&amp;diff=9707"/>
		<updated>2024-03-22T22:05:50Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinta ==&lt;br /&gt;
&lt;br /&gt;
Se dă un șir &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; valori naturale nenule, memorate pe poziții consecutive începând cu poziția &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Notăm cu &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; următoarea secvență de cod aplicată asupra sa:&lt;br /&gt;
&lt;br /&gt;
(C/C++)&lt;br /&gt;
 maxim = 0;&lt;br /&gt;
 rep = 0;&lt;br /&gt;
 for(i = 1; i &amp;lt;= N; i++)&lt;br /&gt;
 	if(V[i] &amp;gt; maxim)&lt;br /&gt;
 		maxim = V[i];&lt;br /&gt;
 	else&lt;br /&gt;
 		if(V[i] == maxim)&lt;br /&gt;
 			rep++;&lt;br /&gt;
Considerăm operația de eliminare din &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; a elementului de pe o anumită poziție dată &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;. În urma operației de eliminare elementele de pe pozițiile &amp;lt;code&amp;gt;P + 1, P + 2, ..., N&amp;lt;/code&amp;gt; ajung pe o poziție cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; mai mică iar &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; scade cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dându-se mai multe operații de eliminare(independente una de alta, adică fiecare se aplică asupra șirului inițial, nu după operația anterioară), să se determine valoarea variabilei &amp;lt;code&amp;gt;rep&amp;lt;/code&amp;gt; dacă am aplica secvența &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; asupra șirului obținut după fiecare operație de eliminare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fițierul &amp;lt;code&amp;gt;maximeIN.txt&amp;lt;/code&amp;gt; conține pe prima linie un număr natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Pe linia a doua se află &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale nenule, separate prin câte un spațiu. Pe linia următoare se află un număr &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; reprezentând numărul de operații de eliminare. Linia următoare conține &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; numere, cuprinse între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, ce reprezină poziția din șir a elementului la care se realizează eliminarea curentă. Numerele de pe această linie sunt separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul &amp;lt;code&amp;gt;maximeOUT.txt&amp;lt;/code&amp;gt; conține pe primul rând &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; numere, separate prin câte un spațiu, reprezentând valoarea variabilei &amp;lt;code&amp;gt;rep&amp;lt;/code&amp;gt; obținută aplicând secvența &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; după fiecare operație de eliminare.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ N ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Vi&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ poziție eliminare ≤ N&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;maximeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
 3 1 3 8 1 8&lt;br /&gt;
 3&lt;br /&gt;
 2 5 6&lt;br /&gt;
&amp;lt;code&amp;gt;maximeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 2 1&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Aplicând prima operație de eliminare, șirul devine: &amp;lt;code&amp;gt;N = 5&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;V = 3 3 8 1 8&amp;lt;/code&amp;gt;, valoarea &amp;lt;code&amp;gt;rep&amp;lt;/code&amp;gt; devine &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicând a doua operație de eliminare, șirul devine: &amp;lt;code&amp;gt;N = 5&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;V = 3 1 3 8 8&amp;lt;/code&amp;gt;, valoarea &amp;lt;code&amp;gt;rep&amp;lt;/code&amp;gt; devine &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplicând a treia operație de eliminare, șirul devine: &amp;lt;code&amp;gt;N = 5&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;V = 3 1 3 8 1&amp;lt;/code&amp;gt;, valoarea &amp;lt;code&amp;gt;rep&amp;lt;/code&amp;gt; devine &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;maximeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100001&lt;br /&gt;
 3 1 3 8 1 8&lt;br /&gt;
 3&lt;br /&gt;
 2 5 6&lt;br /&gt;
&amp;lt;code&amp;gt;maximeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot; def=&amp;quot;&amp;quot; calculeaza_rep(v):=&amp;quot;&amp;quot; maxim=&amp;quot;0&amp;quot; rep=&amp;quot;0&amp;quot; for=&amp;quot;&amp;quot; val=&amp;quot;&amp;quot; in=&amp;quot;&amp;quot; v:=&amp;quot;&amp;quot; if=&amp;quot;&amp;quot;&amp;gt; NMAX = 100005&lt;br /&gt;
&lt;br /&gt;
def verifica_restricții(n, a, m, queries):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifică dacă datele de intrare respectă restricțiile impuse.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if not (2 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if any(v &amp;lt; 1 or v &amp;gt; 100000 for v in a):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= m &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if any(p &amp;lt; 1 or p &amp;gt; n for p in queries):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;maximeIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;maximeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        a = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
        m = int(fin.readline().strip())&lt;br /&gt;
        queries = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
        if not verifica_restricții(n, a, m, queries):&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        premaxim = maxim = -1&lt;br /&gt;
        pozpremaxim = pozmaxim = -1&lt;br /&gt;
        rep = varf = 0&lt;br /&gt;
        CNT = [0] * (NMAX + 2)&lt;br /&gt;
        PZ = [0] * (NMAX + 2)&lt;br /&gt;
        st = [0] * (NMAX + 2)&lt;br /&gt;
        DR = [0] * (NMAX + 2)&lt;br /&gt;
        OK = [0] * (NMAX + 2)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            if a[i-1] &amp;gt; maxim:&lt;br /&gt;
                premaxim, pozpremaxim = maxim, pozmaxim&lt;br /&gt;
                maxim, pozmaxim = a[i-1], i&lt;br /&gt;
                if pozpremaxim &amp;gt;= 1:&lt;br /&gt;
                    PZ[pozpremaxim] = i&lt;br /&gt;
                PZ[pozmaxim] = -1&lt;br /&gt;
                CNT[i] = 1&lt;br /&gt;
            else:&lt;br /&gt;
                while varf &amp;gt; 0 and a[i-1] &amp;gt; a[st[varf]-1]:&lt;br /&gt;
                    varf -= 1&lt;br /&gt;
                if pozmaxim &amp;gt;= 1 and PZ[pozmaxim] == 0 and a[i-1] &amp;gt;= premaxim:&lt;br /&gt;
                    PZ[pozmaxim] = i&lt;br /&gt;
                    if a[i-1] == premaxim:&lt;br /&gt;
                        OK[pozmaxim] = 1&lt;br /&gt;
                if a[i-1] == maxim:&lt;br /&gt;
                    CNT[i] = 2&lt;br /&gt;
                    rep += 1&lt;br /&gt;
&lt;br /&gt;
            st[varf + 1] = i&lt;br /&gt;
            varf += 1&lt;br /&gt;
&lt;br /&gt;
        for i in range(n, 0, -1):&lt;br /&gt;
            while varf &amp;gt; 0 and a[i-1] &amp;gt; a[st[varf]-1]:&lt;br /&gt;
                varf -= 1&lt;br /&gt;
            DR[i] = 1 + DR[st[varf]] if a[i-1] == a[st[varf]-1] else DR[st[varf]]&lt;br /&gt;
            st[varf + 1] = i&lt;br /&gt;
            varf += 1&lt;br /&gt;
&lt;br /&gt;
        for p in queries:&lt;br /&gt;
            if CNT[p] == 0:&lt;br /&gt;
                fout.write(f&amp;quot;{rep} &amp;quot;)&lt;br /&gt;
            elif CNT[p] == 2:&lt;br /&gt;
                fout.write(f&amp;quot;{rep - 1} &amp;quot;)&lt;br /&gt;
            elif CNT[p] == 1:&lt;br /&gt;
                if OK[p]:&lt;br /&gt;
                    fout.write(f&amp;quot;{1 + rep - DR[p] + DR[PZ[p]]} &amp;quot;)&lt;br /&gt;
                else:&lt;br /&gt;
                    fout.write(f&amp;quot;{rep - DR[p] + DR[PZ[p]]} &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;\n&amp;quot;)  # Scriem un newline la sfârșit pentru a încheia output-ul&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2437_-_Turnuri&amp;diff=9706</id>
		<title>2437 - Turnuri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2437_-_Turnuri&amp;diff=9706"/>
		<updated>2024-03-22T21:46:16Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Cel mai nou proiect imobiliar din capitală este compus din &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; blocuri-turn, construite unul lângă altul, de-a lungul unui bulevard central și 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;. Pentru fiecare turn se cunoaște numărul etajelor din care este compus acesta și se mai știe că nu există două turnuri cu același număr de etaje. Ultimele norme urbanistice definesc coeficientul de frumusețe al turnului cu numărul &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; ca fiind numărul turnurilor din secvența de turnuri care începe cu turnul &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, se termină cu turnul &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; și are următoarele proprietăți:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ S ≤ T ≤ D ≤ N&amp;lt;/code&amp;gt;&lt;br /&gt;
* numărul etajelor fiecărui turn din secvență, cu excepţia turnului &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;, este mai mic decât numărul de etaje ale turnului &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Dacă &amp;lt;code&amp;gt;S ≠ 1&amp;lt;/code&amp;gt; atunci turnul &amp;lt;code&amp;gt;S-1&amp;lt;/code&amp;gt; este cel mai apropiat turn din stânga turnului &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;, care are un număr de etaje strict mai mare decât turnul &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Dacă &amp;lt;code&amp;gt;D ≠ N&amp;lt;/code&amp;gt; atunci turnul &amp;lt;code&amp;gt;D+1&amp;lt;/code&amp;gt; este cel mai apropiat turn din dreapta turnului &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;, care are un număr de etaje strict mai mare decât turnul &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Coeficientul de frumusețe al întregului ansamblu de turnuri este suma coeficienților de frumusețe avuţi de turnurile componente. Dezvoltatorul proiectului dorește să renunțe la unul dintre turnuri și să construiască în locul acestuia un restaurant subteran, acesta considerându-se un turn cu zero etaje. Dezvoltatorul dorește să calculeze coeficientul de frumusețe al ansamblului de turnuri, pentru fiecare posibilă amplasare a restaurantului.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; de turnuri și numărul etajelor fiecăruia, determinați coeficientul de frumusețe al ansamblului de turnuri pentru toate cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; posibilități de amplasare ale restaurantului, pe pozițiile &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;,…, &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Datele de intrare se citesc din fişierul &amp;lt;code&amp;gt;turnuriIN.txt&amp;lt;/code&amp;gt;, care are următoarea structură:&lt;br /&gt;
&lt;br /&gt;
- pe prima linie se află numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, reprezentând numărul de turnuri;&lt;br /&gt;
&lt;br /&gt;
- pe a doua linie se află &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; valori naturale nenule, separate prin câte un spațiu, reprezentând numărul etajelor turnurilor;&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Datele de ieşire se vor scrie în fişierul &amp;lt;code&amp;gt;turnuriOUT.txt&amp;lt;/code&amp;gt;, pe linii separate, astfel: pe linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1 ≤ i ≤ N&amp;lt;/code&amp;gt;) se găsește un număr natural reprezentând coeficientul de frumusețe al ansamblului dacă restaurantul s-ar construi în locul turnului &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 100 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Numărul de etaje ale unui turn este un număr natural între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1 000 000 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru teste în valoare de &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; de puncte, avem &amp;lt;code&amp;gt;N ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru teste în valoare de încă &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; de puncte, avem &amp;lt;code&amp;gt;N ≤ 2000&amp;lt;/code&amp;gt;&lt;br /&gt;
* În concurs s-au acordat &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; puncte din oficiu. Aici se acordă pentru exemplul din enunț.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;turnuriIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 10 3 1 7 8 6 5&lt;br /&gt;
&amp;lt;code&amp;gt;turnuriOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 19&lt;br /&gt;
 22&lt;br /&gt;
 22&lt;br /&gt;
 22&lt;br /&gt;
 21&lt;br /&gt;
 22&lt;br /&gt;
 22&lt;br /&gt;
&lt;br /&gt;
== Explicație : ==&lt;br /&gt;
Figura 1 este reprezentarea grafică a fişierului de intrare.&lt;br /&gt;
&lt;br /&gt;
Dacă restaurantul se construiește în locul turnului &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (vezi figura 2), avem următorii coeficienți de frumusețe:&lt;br /&gt;
&lt;br /&gt;
Restaurantul are coeficientul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (el însuși)&lt;br /&gt;
&lt;br /&gt;
Turnul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; are coeficientul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; (secvența compusă din turnurile &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Turnul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; are coeficientul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (el însuși)&lt;br /&gt;
&lt;br /&gt;
Turnul &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; are coeficientul &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; (secvența compusă din turnurile &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Turnul &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; are coeficientul &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; (secvența compusă din toate turnurile)&lt;br /&gt;
&lt;br /&gt;
Turnul &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; are coeficientul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; (secvența compusă din turnurile &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Turnul &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; are coeficientul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (el însuși)&lt;br /&gt;
&lt;br /&gt;
Coeficientul de frumusețe al ansamblului este: &amp;lt;code&amp;gt;1 + 3 + 1 + 4 + 7 + 2 + 1 = 19&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;turnuriIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100001&lt;br /&gt;
 10 3 1 7 8 6 5&lt;br /&gt;
&amp;lt;code&amp;gt;turnuriOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def citeste_date():&lt;br /&gt;
    with open(&amp;quot;turnuriIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        v = [0] + [int(x) for x in fin.readline().split()]&lt;br /&gt;
    return n, v&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(N):&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 100000):&lt;br /&gt;
        return False, &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
    return True, None&lt;br /&gt;
&lt;br /&gt;
def calculeaza_stanga(n, v):&lt;br /&gt;
    st1, st2 = [0] * (n + 1), [0] * (n + 1)&lt;br /&gt;
    q = [[] for _ in range(n + 1)]&lt;br /&gt;
    st = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        while st and v[i] &amp;gt;= v[st[-1]]:&lt;br /&gt;
            q[i].append(st.pop())&lt;br /&gt;
        st1[i] = st[-1] if st else 0&lt;br /&gt;
        st.append(i)&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        t = st1[i]&lt;br /&gt;
        if 1 &amp;lt;= t &amp;lt;= n:&lt;br /&gt;
            while q[t] and v[i] &amp;gt;= v[q[t][0]]:&lt;br /&gt;
                q[t].pop(0)&lt;br /&gt;
        st2[i] = 0 if t == 0 or not q[t] else q[t][0]&lt;br /&gt;
    &lt;br /&gt;
    return st1, st2&lt;br /&gt;
&lt;br /&gt;
def calculeaza_dreapta(n, v):&lt;br /&gt;
    dr1, dr2 = [0] * (n + 1), [0] * (n + 1)&lt;br /&gt;
    q = [[] for _ in range(n + 1)]&lt;br /&gt;
    dr = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(n, 0, -1):&lt;br /&gt;
        while dr and v[i] &amp;gt;= v[dr[-1]]:&lt;br /&gt;
            q[i].append(dr.pop())&lt;br /&gt;
        dr1[i] = dr[-1] if dr else n + 1&lt;br /&gt;
        dr.append(i)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n, 0, -1):&lt;br /&gt;
        t = dr1[i]&lt;br /&gt;
        if 1 &amp;lt;= t &amp;lt;= n:&lt;br /&gt;
            while q[t] and v[i] &amp;gt;= v[q[t][0]]:&lt;br /&gt;
                q[t].pop(0)&lt;br /&gt;
        dr2[i] = n + 1 if t == n + 1 or not q[t] else q[t][0]&lt;br /&gt;
    &lt;br /&gt;
    return dr1, dr2&lt;br /&gt;
&lt;br /&gt;
def calc_fara_restaurant(n, dr1, st1):&lt;br /&gt;
    return sum(dr1[i] - st1[i] - 1 for i in range(1, n + 1))&lt;br /&gt;
&lt;br /&gt;
def calc_cu_restaurant(n, suma, v, st1, st2, dr1, dr2):&lt;br /&gt;
    rez = [suma - (dr1[i] - st1[i] - 1) + 1 for i in range(n + 1)]&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if st1[i] != 0:&lt;br /&gt;
            rez[st1[i]] += st1[i] - st2[i]&lt;br /&gt;
        if dr1[i] != n + 1:&lt;br /&gt;
            rez[dr1[i]] += dr2[i] - dr1[i]&lt;br /&gt;
    return rez&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, v = citeste_date()&lt;br /&gt;
    &lt;br /&gt;
    # Verificăm restricțiile&lt;br /&gt;
    valid, mesaj = verifica_restrictii(n)&lt;br /&gt;
    if not valid:&lt;br /&gt;
        with open(&amp;quot;turnuriOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(mesaj)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    st1, st2 = calculeaza_stanga(n, v)&lt;br /&gt;
    dr1, dr2 = calculeaza_dreapta(n, v)&lt;br /&gt;
    suma = calc_fara_restaurant(n, dr1, st1)&lt;br /&gt;
    rez = calc_cu_restaurant(n, suma, v, st1, st2, dr1, dr2)&lt;br /&gt;
    &lt;br /&gt;
    with open(&amp;quot;turnuriOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            fout.write(f&amp;quot;{rez[i]}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3134_-_INF&amp;diff=9705</id>
		<title>3134 - INF</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3134_-_INF&amp;diff=9705"/>
		<updated>2024-03-22T21:17:15Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinta ==&lt;br /&gt;
&lt;br /&gt;
Se consideră șirul infinit &amp;lt;code&amp;gt;inf=&amp;quot;INFINFINFINF...&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se dau două numere naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; și un șir de caractere &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; de lungime &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; format doar din caracterele &amp;lt;code&amp;gt;&#039;I&#039;&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;&#039;N&#039;&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;&#039;F&#039;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Să se afle numărul minim de modificări ce trebuie realizate în șirul &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; pentru a obține o subsecvență de lungime &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; a șirului infinit &amp;lt;code&amp;gt;inf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O modificare constă în schimbarea unui caracter din șirul &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; cu un alt caracter din mulțimea &amp;lt;code&amp;gt;{&#039;I&#039;,&#039;N&#039;,&#039;F&#039;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
De exemplu, în urma unei modificări a ultimului caracter, șirul &amp;lt;code&amp;gt;&amp;quot;IIIFN&amp;quot;&amp;lt;/code&amp;gt; devine &amp;lt;code&amp;gt;&amp;quot;IIIFF&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;infIN.txt&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;, iar pe a doua linie șirul &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; format din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; caractere.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;infOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul de modificări necesare. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ n ≤ 1.500.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ 500.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* Rezultatul poate fi &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
* O subsecvență de lungime &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; a șirului &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; reprezintă un șir format din &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; elemente de pe poziții consecutive din șirul &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;infIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 2&lt;br /&gt;
 FNNNN&lt;br /&gt;
&amp;lt;code&amp;gt;infOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
&lt;br /&gt;
== Explicație: ==&lt;br /&gt;
Exemplul 1: Numărul minim de modificări este 1. Înlocuind primul caracter cu &amp;lt;code&amp;gt;&#039;I&#039;&amp;lt;/code&amp;gt; vom obține subsecvența de lungime 2: &amp;lt;code&amp;gt;&amp;quot;IN&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;infIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 5&lt;br /&gt;
 NFFNI&lt;br /&gt;
&amp;lt;code&amp;gt;infOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import deque&lt;br /&gt;
&lt;br /&gt;
def next(ch):&lt;br /&gt;
    if ch == &#039;I&#039;:&lt;br /&gt;
        return &#039;N&#039;&lt;br /&gt;
    if ch == &#039;N&#039;:&lt;br /&gt;
        return &#039;F&#039;&lt;br /&gt;
    return &#039;I&#039;&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n, k):&lt;br /&gt;
    if not (2 &amp;lt;= n &amp;lt;= 1_500_000 and 1 &amp;lt;= k &amp;lt;= 500_000 and k &amp;lt;= n):&lt;br /&gt;
        with open(&amp;quot;infOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
            outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;infIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as infile:&lt;br /&gt;
        n, k = map(int, infile.readline().split())&lt;br /&gt;
        s = infile.readline().strip()&lt;br /&gt;
&lt;br /&gt;
    if not check_constraints(n, k):&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    now = then = [s[i] for i in range(3)]  # Inițializăm now și then cu primele 3 caractere din șirul s&lt;br /&gt;
    result = [0, 0, 0]&lt;br /&gt;
    res = float(&#039;inf&#039;)  # Inițializăm res cu infinit&lt;br /&gt;
    q = deque()&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        ch = s[i - 1]&lt;br /&gt;
        q.append(ch)&lt;br /&gt;
        for j in range(3):&lt;br /&gt;
            result[j] += (now[j] != ch)&lt;br /&gt;
            now[j] = next(now[j])&lt;br /&gt;
        &lt;br /&gt;
        if i &amp;gt;= k:&lt;br /&gt;
            if i &amp;gt; k:&lt;br /&gt;
                cnow = q.popleft()&lt;br /&gt;
                for j in range(3):&lt;br /&gt;
                    result[j] -= (then[j] != cnow)&lt;br /&gt;
                    then[j] = next(then[j])&lt;br /&gt;
            res = min(res, min(result))&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;infOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
        if res != float(&#039;inf&#039;):&lt;br /&gt;
            outfile.write(str(res))&lt;br /&gt;
        else:&lt;br /&gt;
            outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3404_-_castel3&amp;diff=9704</id>
		<title>3404 - castel3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3404_-_castel3&amp;diff=9704"/>
		<updated>2024-03-22T20:53:49Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Înspăimântătorii tăi luptători au răpit-o pe Prinţesa Ghiocela şi au închis-o în castelul tău de pe vârful Muntelui Pleşuv. Deoarece eşti un geniu malefic, te-ai hotărât să îi oferi prinţesei iluzia unei şanse de evadare.&lt;br /&gt;
&lt;br /&gt;
Castelul tău are forma unui caroiaj cu &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; coloane. Cele &amp;lt;code&amp;gt;M x N&amp;lt;/code&amp;gt; celule ale castelului sunt numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;M x N&amp;lt;/code&amp;gt; în ordinea parcurgerii caroiajului pe linii de sus în jos, iar pe aceeaşi linie în ordinea coloanelor de la stânga la dreapta. În fiecare dintre celulele castelului ai pus câte o cheie, mai precis celula &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; conţine cheia cu numărul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Evident, pentru a intra într-o cameră, prinţesa are nevoie de o anume cheie care permite deschiderea acesteia. Mai mult, dintr-o cameră prinţesa se poate deplasa într-un moment numai într-una dintre cele maximum patru camere adiacente pe orizontală şi verticală, doar dacă deţine cheia necesară deschiderii sale. Odată ce a intrat într-o cameră şi a obţinut o cheie, prinţesa o păstrează şi poate să o utilizeze ori de câte ori doreşte.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Deşi eşti convins că prinţesa nu va scăpa din castel, eşti curios să afli câte dintre cele &amp;lt;code&amp;gt;M x N&amp;lt;/code&amp;gt; camere îi sunt accesibile. Date fiind dimensiunile castelului, camera în care se află iniţial prinţesa şi cheile necesare deschiderii fiecăreia dintre camere, află răspunsul la această întrebare presantă.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;castelIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie trei numere naturale &amp;lt;code&amp;gt;M N K&amp;lt;/code&amp;gt; separate prin câte un spaţiu reprezentând dimensiunile castelului, respectiv numărul camerei în care se află iniţial prinţesa. Urmează descrierea castelului. Pe fiecare dintre următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se află câte &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale cuprinse între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;M x N&amp;lt;/code&amp;gt; reprezentând cheile necesare deschiderii fiecăreia dintre camere.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;castelOUT.txt&amp;lt;/code&amp;gt; va conţine o singură linie pe care va fi scris un singur număr natural reprezentând numărul de camere accesibile prinţesei.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M, N ≤ 150&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ K ≤ M * N&amp;lt;/code&amp;gt;&lt;br /&gt;
* Odată ce prinţesa a păşit într-o cameră, respectiva cameră va rămâne pentru totdeauna deschisă.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;castelIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 3 1&lt;br /&gt;
 1 1 4&lt;br /&gt;
 1 6 2&lt;br /&gt;
 6 9 8&lt;br /&gt;
 12 10 11&lt;br /&gt;
&amp;lt;code&amp;gt;castelOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;castelIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 151 3 1&lt;br /&gt;
 1 1 4&lt;br /&gt;
 1 6 2&lt;br /&gt;
 6 9 8&lt;br /&gt;
 12 10 11&lt;br /&gt;
&amp;lt;code&amp;gt;castelOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Prinţesa porneşte din camera &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Aici foloseşe cheia &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi intră în camera &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;. Se întoarce în camera &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi descuie camera &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;. Foloseşte cheia luată din camera &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; şi descuie camera &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;. În acest moment ea deţine cheile &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;. Foloseşte cheia &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; şi intră în camera &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;, apoi foloseşte cheia &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; şi intră în camera &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;, apoi în camera &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, de unde, folosind cheia luată din camera &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; intră în camera &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;. La final prinţesa are cheile &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; şi nu mai poate deschide nici o altă cameră.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import deque&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, m, cam):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 150 and 1 &amp;lt;= m &amp;lt;= 150 and 1 &amp;lt;= cam &amp;lt;= n * m):&lt;br /&gt;
        with open(&amp;quot;castelOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    di = [0, 0, 1, -1]&lt;br /&gt;
    dj = [1, -1, 0, 0]&lt;br /&gt;
    N = 155&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;castelIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, m, cam = map(int, fin.readline().split())&lt;br /&gt;
        if not verifica_restrictii(n, m, cam):&lt;br /&gt;
            return&lt;br /&gt;
        mat = [[0] * (m + 1) for _ in range(n + 1)]&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            mat[i][1:m + 1] = map(int, fin.readline().split())&lt;br /&gt;
&lt;br /&gt;
    sx = cam // m + 1&lt;br /&gt;
    sy = cam % m&lt;br /&gt;
    if cam % m == 0:&lt;br /&gt;
        sx -= 1&lt;br /&gt;
        sy = m&lt;br /&gt;
&lt;br /&gt;
    q = deque([(sx, sy)])&lt;br /&gt;
    viz = [False] * (N * N)&lt;br /&gt;
    deja = [[False] * (m + 1) for _ in range(n + 1)]&lt;br /&gt;
    astept = [[] for _ in range(N * N)]&lt;br /&gt;
&lt;br /&gt;
    while q:&lt;br /&gt;
        x, y = q.popleft()&lt;br /&gt;
        CAM = (x - 1) * m + y&lt;br /&gt;
        deja[x][y] = viz[CAM] = True&lt;br /&gt;
&lt;br /&gt;
        for cam in astept[CAM]:&lt;br /&gt;
            ny = cam % m&lt;br /&gt;
            nx = cam // m + 1&lt;br /&gt;
            if cam % m == 0:&lt;br /&gt;
                nx -= 1&lt;br /&gt;
                ny = m&lt;br /&gt;
            if not deja[nx][ny]:&lt;br /&gt;
                q.append((nx, ny))&lt;br /&gt;
        &lt;br /&gt;
        astept[CAM].clear()&lt;br /&gt;
&lt;br /&gt;
        for dir in range(4):&lt;br /&gt;
            nx = x + di[dir]&lt;br /&gt;
            ny = y + dj[dir]&lt;br /&gt;
            cam = (nx - 1) * m + ny&lt;br /&gt;
            if 1 &amp;lt;= nx &amp;lt;= n and 1 &amp;lt;= ny &amp;lt;= m:&lt;br /&gt;
                if viz[mat[nx][ny]]:&lt;br /&gt;
                    if not deja[nx][ny]:&lt;br /&gt;
                        q.append((nx, ny))&lt;br /&gt;
                else:&lt;br /&gt;
                    astept[mat[nx][ny]].append(cam)&lt;br /&gt;
&lt;br /&gt;
    res = sum(deja[i][j] for i in range(1, n + 1) for j in range(1, m + 1))&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;castelOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(res) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3696_-_taxa&amp;diff=9703</id>
		<title>3696 - taxa</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3696_-_taxa&amp;diff=9703"/>
		<updated>2024-03-22T20:40:20Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Miruna se pregăteşte de vacanţa de vară. Ea a hotărât deja că împreună cu un grup de colegi să facă o excursie în regatul INFO unde moneda locală se numeşte BOSS. A studiat deja harta acestei zone şi a aflat multe lucruri interesante. Ea ştie că regatul se află pe o insula cu suprafaţa uscatului sub forma dreptunghiulară ce poate fi reprezentată ca o matrice cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; coloane în care fiecare element este un cod pentru un tip de obiectiv turistic ce poate fi vizitat. Deoarece sosirea şi plecarea de pe insulă se face cu avionul, ea cunoaşte poziția &amp;lt;code&amp;gt;(l0,c0)&amp;lt;/code&amp;gt; unde va fi debarcată şi poziţia &amp;lt;code&amp;gt;(lf,cf)&amp;lt;/code&amp;gt; unde va fi plecarea de pe insulă. Ea se poate deplasa pentru vizitarea obiectivelor turistice doar în celule vecine pe cele opt direcţii (&amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NV&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SV&amp;lt;/code&amp;gt;), iar dacă nouă poziţie are alt cod decât cel din care venise la pasul precedent, atunci trebuie să plătească o taxa de vizitare egală cu produsul codurilor celor doua zone (exprimată tot în moneda locală, BOSS!!!). Miruna ar dori să afle care ar fi suma minimă necesară pentru a se deplasa până la locul de plecare de pe insulă.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Dându-se configuraţia regatului şi poziţiile de plecare şi sosire, să se determine suma minimă necesară deplasării.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Pe prima linie a fişierului &amp;lt;code&amp;gt;taxaIN.txt&amp;lt;/code&amp;gt; se află valorile naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;l0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cf&amp;lt;/code&amp;gt;. Pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii se află câte &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; elemente, codurile fiecărei zone, numere naturale separate prin câte un spaţiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;taxaOUT.txt&amp;lt;/code&amp;gt; va conține un număr natural &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;, reprezentând suma minimă necesară deplasării. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; N, M &amp;lt; 1001&amp;lt;/code&amp;gt;&lt;br /&gt;
* Obiectivele au coduri numere naturale nenule mai mici sau egale cu &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;, iar poziţia inițială şi finală sunt distincte&lt;br /&gt;
* Pentru 30% din teste vom avea &amp;lt;code&amp;gt;N, M ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 20% din teste matricea conţine numai două valori.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;taxaIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 5 1 1 4 5&lt;br /&gt;
 1 1 2 2 2&lt;br /&gt;
 1 2 3 3 3&lt;br /&gt;
 1 1 3 3 3&lt;br /&gt;
 2 2 2 2 2&lt;br /&gt;
 1 1 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;taxaOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Suma minimă necesară deplasării din &amp;lt;code&amp;gt;(1,1)&amp;lt;/code&amp;gt; în &amp;lt;code&amp;gt;(4,5)&amp;lt;/code&amp;gt; este de &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; BOSSi.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;taxaIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1002 5 1 1 4 5&lt;br /&gt;
 1 1 2 2 2&lt;br /&gt;
 1 2 3 3 3&lt;br /&gt;
 1 1 3 3 3&lt;br /&gt;
 2 2 2 2 2&lt;br /&gt;
 1 1 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;taxaOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
=== Rezolvare ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from queue import Queue&lt;br /&gt;
&lt;br /&gt;
dl = [-1, -1, -1, 0, 1, 1, 1, 0]&lt;br /&gt;
dc = [-1, 0, 1, 1, 1, 0, -1, -1]&lt;br /&gt;
&lt;br /&gt;
def inside(x, y, n, m):&lt;br /&gt;
    return x &amp;gt;= 0 and x &amp;lt; n and y &amp;gt;= 0 and y &amp;lt; m&lt;br /&gt;
&lt;br /&gt;
def fill(x, y, x0, y0, c):&lt;br /&gt;
    if inside(x, y, n, m) and cost[x][y] == -1:&lt;br /&gt;
        if a[x][y] == a[x0][y0]:&lt;br /&gt;
            cost[x][y] = c&lt;br /&gt;
            for p in range(8):&lt;br /&gt;
                fill(x + dl[p], y + dc[p], x0, y0, c)&lt;br /&gt;
        else:&lt;br /&gt;
            q[c + a[x][y] * a[x0][y0]].put((x, y))&lt;br /&gt;
&lt;br /&gt;
def pseudo_lee():&lt;br /&gt;
    q[0].put((l0, c0))&lt;br /&gt;
&lt;br /&gt;
    for i in range(CMAX):&lt;br /&gt;
        while not q[i].empty():&lt;br /&gt;
            iv, jv = q[i].get()&lt;br /&gt;
&lt;br /&gt;
            if cost[iv][jv] == -1:&lt;br /&gt;
                fill(iv, jv, iv, jv, i)&lt;br /&gt;
&lt;br /&gt;
            if cost[lf][cf] != -1:&lt;br /&gt;
                return cost[lf][cf]&lt;br /&gt;
&lt;br /&gt;
def validate_restrictions(n, m, l0, c0, lf, cf):&lt;br /&gt;
    if not (0 &amp;lt; n &amp;lt;= 1000 and 0 &amp;lt; m &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (0 &amp;lt;= l0 - 1 &amp;lt; n and 0 &amp;lt;= c0 - 1 &amp;lt; m and 0 &amp;lt;= lf - 1 &amp;lt; n and 0 &amp;lt;= cf - 1 &amp;lt; m):&lt;br /&gt;
        return False&lt;br /&gt;
    if (l0, c0) == (lf, cf):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;taxaIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as in_file:&lt;br /&gt;
    n, m, l0, c0, lf, cf = map(int, in_file.readline().split())&lt;br /&gt;
    # Verificăm dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not validate_restrictions(n, m, l0, c0, lf, cf):&lt;br /&gt;
        with open(&amp;quot;taxaOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as out_file:&lt;br /&gt;
            out_file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        exit()  # Oprim execuția dacă datele nu respectă restricțiile&lt;br /&gt;
&lt;br /&gt;
    # Deoarece datele sunt indexate de la 1, le ajustăm indexul&lt;br /&gt;
    l0 -= 1&lt;br /&gt;
    c0 -= 1&lt;br /&gt;
    lf -= 1&lt;br /&gt;
    cf -= 1&lt;br /&gt;
&lt;br /&gt;
    a = []&lt;br /&gt;
    cost = []&lt;br /&gt;
    for _ in range(n):&lt;br /&gt;
        row = list(map(int, in_file.readline().split()))&lt;br /&gt;
        a.append(row)&lt;br /&gt;
        cost.append([-1] * m)&lt;br /&gt;
&lt;br /&gt;
CMAX = 4 * 10 ** 4 + 10&lt;br /&gt;
q = [Queue() for _ in range(CMAX + 5)]&lt;br /&gt;
&lt;br /&gt;
result = pseudo_lee()&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;taxaOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as out_file:&lt;br /&gt;
    out_file.write(str(result))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2167_-_alee&amp;diff=9702</id>
		<title>2167 - alee</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2167_-_alee&amp;diff=9702"/>
		<updated>2024-03-22T20:26:27Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Parcul oraşului a fost neglijat mult timp, astfel că acum toate aleile sunt distruse. Prin urmare, anul acesta Primăria şi-a propus să facă reamenajări. Parcul are forma unui pătrat cu latura de &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; metri și este înconjurat de un gard care are exact două porți. Proiectanții de la Primărie au realizat o hartă a parcului și au trasat pe hartă un caroiaj care împarte parcul în &amp;lt;code&amp;gt;nxn&amp;lt;/code&amp;gt; zone pătrate cu latura de &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; metru. Astfel harta parcului are aspectul unei matrice pătratice cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane. Liniile și respectiv coloanele sunt 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;. Elementele matricei corespund zonelor pătrate de latură &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; metru. O astfel de zonă poate să conțină un copac sau este liberă. Edilii orașului doresc să paveze cu un număr minim de dale pătrate cu latura de &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; metru zonele libere (fără copaci) ale parcului, astfel încât să se obțină o alee continuă de la o poartă la alta.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieți un program care să determine numărul minim de dale necesare pentru construirea unei alei continue de la o poartă la cealaltă.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;aleeIN.txt&amp;lt;/code&amp;gt; conține pe prima linie două valori naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; separate printr-un spațiu, reprezentând dimensiunea parcului, respectiv numărul de copaci care se găsesc în parc. Fiecare dintre următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conține câte două numere naturale &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; separate printr-un spațiu, reprezentând pozițiile copacilor în parc (&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; reprezintă linia, iar &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; reprezintă coloana zonei în care se află copacul). Ultima linie a fișierului conține patru numere naturale &amp;lt;code&amp;gt;x1 y1 x2 y2&amp;lt;/code&amp;gt;, separate prin câte un spațiu, reprezentând pozițiile celor două porți (&amp;lt;code&amp;gt;x1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y1&amp;lt;/code&amp;gt; reprezintă linia și respectiv coloana zonei ce conține prima poartă, iar &amp;lt;code&amp;gt;x2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y2&amp;lt;/code&amp;gt; reprezintă linia și respectiv coloana zonei ce conține cea de a doua poartă).&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;aleeOUT.txt&amp;lt;/code&amp;gt; va conţine o singură linie pe care va fi scris un număr natural care reprezintă numărul minim de dale necesare pentru construirea aleii. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 175&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m &amp;lt; n*n&amp;lt;/code&amp;gt;&lt;br /&gt;
* Aleea este continuă dacă oricare două plăci consecutive au o latură comună.&lt;br /&gt;
* Aleea începe cu zona unde se găsește prima poartă și se termină cu zona unde se găsește cea de a doua poartă.&lt;br /&gt;
* Pozițiile porților sunt distincte şi corespund unor zone libere.&lt;br /&gt;
* Pentru datele de test există întotdeauna soluție.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;aleeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8 6 &lt;br /&gt;
 2 7&lt;br /&gt;
 3 3&lt;br /&gt;
 4 6&lt;br /&gt;
 5 4&lt;br /&gt;
 7 3&lt;br /&gt;
 7 5 &lt;br /&gt;
 1 1 8 8&lt;br /&gt;
&amp;lt;code&amp;gt;aleeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 15&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
O modalitate de a construi aleea cu număr minim de dale este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;OOO-----&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--OO--x-&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--xO----&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;---OOx--&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;---xO---&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;----OO--&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--x-xOO-&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;------OO&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(cu &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; am marcat copacii, cu &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; zonele libere, iar cu &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; dalele aleii).&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;aleeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 200 6 &lt;br /&gt;
 2 7&lt;br /&gt;
 3 3&lt;br /&gt;
 4 6&lt;br /&gt;
 5 4&lt;br /&gt;
 7 3&lt;br /&gt;
 7 5 &lt;br /&gt;
 1 1 8 8&lt;br /&gt;
&amp;lt;code&amp;gt;aleeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import deque&lt;br /&gt;
&lt;br /&gt;
dx = [-1, 0, 0, 1]&lt;br /&gt;
dy = [0, -1, 1, 0]&lt;br /&gt;
&lt;br /&gt;
def read():&lt;br /&gt;
    global n, m, x1, y1, x2, y2, a&lt;br /&gt;
    with open(&amp;quot;aleeIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n, m = map(int, f.readline().split())&lt;br /&gt;
        if not check_restrictions():&lt;br /&gt;
            return False&lt;br /&gt;
        a = [[0] * (n + 1) for _ in range(n + 1)]&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            i, j = map(int, f.readline().split())&lt;br /&gt;
            a[i][j] = -1&lt;br /&gt;
        x1, y1, x2, y2 = map(int, f.readline().split())&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def check_restrictions():&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 175):&lt;br /&gt;
        with open(&amp;quot;aleeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= m &amp;lt; n * n):&lt;br /&gt;
        with open(&amp;quot;aleeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def OK(i, j):&lt;br /&gt;
    if i &amp;lt; 1 or i &amp;gt; n or j &amp;lt; 1 or j &amp;gt; n:&lt;br /&gt;
        return False&lt;br /&gt;
    if a[i][j] == -1:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def lee():&lt;br /&gt;
    global a&lt;br /&gt;
    Q = deque([(x1, y1)])&lt;br /&gt;
    a[x1][y1] = 1&lt;br /&gt;
    while Q:&lt;br /&gt;
        i, j = Q.popleft()&lt;br /&gt;
        for k in range(4):&lt;br /&gt;
            ni = i + dx[k]&lt;br /&gt;
            nj = j + dy[k]&lt;br /&gt;
            if OK(ni, nj) and a[ni][nj] &amp;lt; 1:&lt;br /&gt;
                a[ni][nj] = a[i][j] + 1&lt;br /&gt;
                Q.append((ni, nj))&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    if not read():&lt;br /&gt;
        return&lt;br /&gt;
    lee()&lt;br /&gt;
    with open(&amp;quot;aleeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(str(a[x2][y2]) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1763_-_Pachete2&amp;diff=9701</id>
		<title>1763 - Pachete2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1763_-_Pachete2&amp;diff=9701"/>
		<updated>2024-03-22T20:05:58Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt == &lt;br /&gt;
&lt;br /&gt;
Se consideră un șir de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere ce reprezintă cantitățile disponibile de produse de sezon de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; tipuri, în ordinea în care acestea sunt aduse de la magazie. Un automat poate realiza pachete cu două dintre tipurile de produse venite una imediat după cealaltă de la magazie. El este programat să pună în fiecare pachet un același număr &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; de produse de un tip și un același număr &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; de produse de celălalt tip, astfel încât să nu rămână produse necuprinse în pachete.&lt;br /&gt;
&lt;br /&gt;
De exemplu, dacă există &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; de prăjiturele COCO și &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; cutii de suc JUMBO, atunci automatul va fi programat să pună &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; prăjiturele și &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; sucuri în fiecare pachet, epuizând simultan stocul de prăjiturele și cutii de suc și obținând astfel &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; pachete. Pentru alte două tipuri de produse consecutive se va proceda la fel, schimbându-se doar parametrii &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; ale programului de împachetare.&lt;br /&gt;
&lt;br /&gt;
La unele produse din șir se poate renunța în totalitate, nefiind incluse în niciun pachet.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscându-se numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; de tipuri de produse și cantitățile din fiecare produs, în ordinea în care sosesc de la magazie, să se stabilească numărul maxim de pachete care se pot obține prin alegerea convenabilă a perechilor de produse consecutive și programarea corespunzătoare a automatului, pentru fiecare pereche aleasă.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Din fișierul &amp;lt;code&amp;gt;pachete2.in&amp;lt;/code&amp;gt; se citesc, de pe prima linie numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; de tipuri de produse, iar de pe linia a doua, &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale reprezentând stocurile de produse de fiecare tip, în ordinea în care vin acestea de la magazie. Numerele sunt despărțite între ele prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
În fișierul &amp;lt;code&amp;gt;pachete2.out&amp;lt;/code&amp;gt; se afișează valoarea &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; reprezentând numărul maxim de pachete care se pot forma. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1≤N≤100000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Numărul de produse disponibile din fiecare tip este un număr natural nenul cu cel mult &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; cifre.&lt;br /&gt;
* Din orice produs din șir, mașina de împachetat poate fi programată să pună în fiecare pachet cel puțin unul și cel mult toate produsele disponibile.&lt;br /&gt;
* Numărul maxim de pachete obținut este cel mult &amp;lt;code&amp;gt;2000000000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* După ultimul număr din fișier se pot afla unul sau mai multe spații.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;pachete2IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
 20 15 18 12 13&lt;br /&gt;
&lt;br /&gt;
 6&lt;br /&gt;
 18 9 5 14 63 2&lt;br /&gt;
&amp;lt;code&amp;gt;pachete2OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 11&lt;br /&gt;
&lt;br /&gt;
 16&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Se fac &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; pachete cu primele două tipuri de produse (punând &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; și respectiv &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; din fiecare) și se fac &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; pachete cu următoarele două tipuri de produse (punând &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și respectiv &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; din fiecare). Ultimul produs rămâne nefolosit.&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Se fac &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; pachete cu primele două produse (punând &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și respectiv &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; din fiecare), nu se folosește produsul al treilea, se fac &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; pachete cu al patrulea și al cincilea produs (punând &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și respectiv &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; din fiecare). Ultimul produs rămâne nefolosit.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;pachete2IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1000001&lt;br /&gt;
 20 15 18 12 13&lt;br /&gt;
&lt;br /&gt;
 6&lt;br /&gt;
 18 9 5 14 63 2&lt;br /&gt;
&amp;lt;code&amp;gt;pachete2OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def cmmdc(a, b):&lt;br /&gt;
    while b:&lt;br /&gt;
        a, b = b, a % b&lt;br /&gt;
    return a&lt;br /&gt;
&lt;br /&gt;
def check_constraints(num_sets, x_values):&lt;br /&gt;
    # Constraint 1: 1 ≤ N ≤ 100000&lt;br /&gt;
    if not (1 &amp;lt;= num_sets &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Constraint 2: Numărul de produse disponibile din fiecare tip este un număr natural nenul cu cel mult 6 cifre.&lt;br /&gt;
    for x_list in x_values:&lt;br /&gt;
        for x in x_list:&lt;br /&gt;
            if not (1 &amp;lt;= x &amp;lt;= 999999):&lt;br /&gt;
                return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def handle_constraints_error(g):&lt;br /&gt;
    g.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;pachete2IN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f, open(&amp;quot;pachete2OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
            num_sets = int(f.readline())&lt;br /&gt;
            x_values_list = []&lt;br /&gt;
            for _ in range(num_sets):&lt;br /&gt;
                x_values = list(map(int, f.readline().split()))&lt;br /&gt;
                x_values_list.append(x_values)&lt;br /&gt;
&lt;br /&gt;
            if not check_constraints(len(x_values_list), x_values_list):&lt;br /&gt;
                handle_constraints_error(g)&lt;br /&gt;
                return  # Exit program if constraints are violated&lt;br /&gt;
&lt;br /&gt;
            for x_values in x_values_list:&lt;br /&gt;
                n = len(x_values)&lt;br /&gt;
                c = [0] * (n + 1)&lt;br /&gt;
                m = [0] * (n + 1)&lt;br /&gt;
                if n &amp;gt;= 2:&lt;br /&gt;
                    x = x_values[0]&lt;br /&gt;
                    for i in range(1, n):&lt;br /&gt;
                        y = x_values[i]&lt;br /&gt;
                        c[i] = cmmdc(x, y)&lt;br /&gt;
                        x = y&lt;br /&gt;
&lt;br /&gt;
                    m[1] = 0&lt;br /&gt;
                    m[2] = c[1]&lt;br /&gt;
&lt;br /&gt;
                    for i in range(3, n + 1):&lt;br /&gt;
                        m[i] = max(m[i - 1], m[i - 2] + c[i - 1])&lt;br /&gt;
&lt;br /&gt;
                    result = str(m[n]) if m[n] != 0 else &amp;quot;&amp;quot;&lt;br /&gt;
                    g.write(result + &#039;\n&#039;)&lt;br /&gt;
    except FileNotFoundError:&lt;br /&gt;
        print(&amp;quot;Input file &#039;pachete2IN.txt&#039; not found.&amp;quot;)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(&amp;quot;An error occurred:&amp;quot;, e)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3058_-_vip&amp;diff=9700</id>
		<title>3058 - vip</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3058_-_vip&amp;diff=9700"/>
		<updated>2024-03-22T19:37:53Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Două personaje ale căror nume se vor da în datele de intrare (momentan îi numim Bossanip și Dicsi) își petrec nopțile prin discoteci. Toată lumea știe că Bossanip este membru V.I.P în toate discotecile din lume și Dicsi profită mereu de celebritatea prietenului său. Ajuns pe meleaguri străine, Dicsi s-a confruntat cu o problemă foarte mare. Cum intră la V.I.P când este pe cont propriu? Astfel, Dicsi s-a apucat de infracțiuni precum furtul de identitate. Dicsi dorește să permute literele din numele lui (să găsească o anagramă a propriului nume) astfel încât noul nume să difere prin exact &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; poziții de numele lui Bossanip. Mai mult, dorește ca această anagramă să fie minimă lexicografic. Dacă reușește, este posibil să se dea drept Bossanip și să intre și el ca membru V.I.P.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
În fișierul text &amp;lt;code&amp;gt;vipIN.txt&amp;lt;/code&amp;gt; pe prima linie se află numărul natural &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;. Pe următoarele &amp;lt;code&amp;gt;3∙T&amp;lt;/code&amp;gt; linii sunt descrise &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; seturi de date de intrare, fiecare set ocupă câte trei linii astfel: pe prima linie a unui set se află scrise două numere naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; (lungimea numelor reale ale lui Bossanip și Dicsi) și &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;; pe a doua linie a unui set este scris numele lui Bossanip dat printr-un șir de caractere &amp;lt;code&amp;gt;s1&amp;lt;/code&amp;gt;; pe a treia linie a unui set este scris numele lui Dicsi dat printr-un șir de caractere &amp;lt;code&amp;gt;s2&amp;lt;/code&amp;gt;. Din fericire pentru Dicsi, cele două personaje au nume de aceeași lungime.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
În fișierul text &amp;lt;code&amp;gt;vipOUT.txt&amp;lt;/code&amp;gt; se vor scrie, pe fiecare din cele &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; linii câte un șir de caractere, pe a &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;-a linie este scrisă anagrama corespunzătoare testului &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; (noul nume al lui Dicsi) sau &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; dacă nu există o astfel de anagramă. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N, K ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Suma valorilor lui &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; din cadrul seturilor de test este mai mică sau egală cu &amp;lt;code&amp;gt;1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Toate literele sunt litere mici ale alfabetului englez&lt;br /&gt;
* Dacă nu există soluție pentru un test, atunci se va afișa valoarea &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Un șir &amp;lt;code&amp;gt;p1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;p2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;pN&amp;lt;/code&amp;gt; este mai mic lexicografic decât un alt șir &amp;lt;code&amp;gt;q1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;qN&amp;lt;/code&amp;gt;, dacă există o poziție &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;1 ≤ i ≤ N&amp;lt;/code&amp;gt;, astfel încât &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;lt; qi&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;pj&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;= qj&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ j &amp;lt; i&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru &amp;lt;code&amp;gt;25%&amp;lt;/code&amp;gt; din punctaj se poate afișa orice soluție corectă care nu este neapărat minimă lexicografic&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;vipIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 &lt;br /&gt;
 8 6 &lt;br /&gt;
 corleone &lt;br /&gt;
 vasilica &lt;br /&gt;
 5 2 &lt;br /&gt;
 marko &lt;br /&gt;
 ghita&lt;br /&gt;
&amp;lt;code&amp;gt;vipOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 caaliisv &lt;br /&gt;
 -1&lt;br /&gt;
&lt;br /&gt;
=== Explicație: ===&lt;br /&gt;
În primul set cea mai mică anagramă a șirului &amp;lt;code&amp;gt;vasilica&amp;lt;/code&amp;gt;, din punct de vedere lexicografic, care diferă de șirul &amp;lt;code&amp;gt;corleone&amp;lt;/code&amp;gt; pe exact &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; poziții, este &amp;lt;code&amp;gt;caaliisv&amp;lt;/code&amp;gt; În al doilea set nici una din anagramele șirului &amp;lt;code&amp;gt;ghita&amp;lt;/code&amp;gt; nu poate să difere pe exact două poziții de șirul &amp;lt;code&amp;gt;marko&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;vipIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 &lt;br /&gt;
 80000000000 6&lt;br /&gt;
 corleone &lt;br /&gt;
 vasilica &lt;br /&gt;
 5 2 &lt;br /&gt;
 marko &lt;br /&gt;
 ghita&lt;br /&gt;
&amp;lt;code&amp;gt;vipOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def citeste_intrare(nume_fisier):&lt;br /&gt;
    with open(nume_fisier, &#039;r&#039;) as f:&lt;br /&gt;
        t = int(f.readline().strip())&lt;br /&gt;
        cazuri = []&lt;br /&gt;
        for _ in range(t):&lt;br /&gt;
            n, k = map(int, f.readline().strip().split())&lt;br /&gt;
            s1 = f.readline().strip()&lt;br /&gt;
            s2 = f.readline().strip()&lt;br /&gt;
            cazuri.append((n, k, s1, s2))&lt;br /&gt;
    return cazuri&lt;br /&gt;
&lt;br /&gt;
def verifica_invariant(freq1, freq2, egali, diferiti, sigma=26):&lt;br /&gt;
    nevoie_extra_op = 0&lt;br /&gt;
    max_extra = 0&lt;br /&gt;
    for i in range(1, sigma + 1):&lt;br /&gt;
        extra_car = freq1[i] + freq2[i] - diferiti&lt;br /&gt;
        extra_op = (extra_car + 1) // 2&lt;br /&gt;
        if extra_op &amp;gt; min(freq1[i], freq2[i]):&lt;br /&gt;
            return False&lt;br /&gt;
        max_extra += min(freq1[i], freq2[i])&lt;br /&gt;
        if extra_op &amp;gt; 0:&lt;br /&gt;
            nevoie_extra_op += extra_op&lt;br /&gt;
    return nevoie_extra_op &amp;lt;= egali and egali &amp;lt;= max_extra&lt;br /&gt;
&lt;br /&gt;
def rezolva_caz(n, k, s1, s2):&lt;br /&gt;
    freq1 = [0] * 27&lt;br /&gt;
    freq2 = [0] * 27&lt;br /&gt;
    answer = [&#039;&#039;] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    for char in s1:&lt;br /&gt;
        freq1[ord(char) - ord(&#039;a&#039;) + 1] += 1&lt;br /&gt;
    for char in s2:&lt;br /&gt;
        freq2[ord(char) - ord(&#039;a&#039;) + 1] += 1&lt;br /&gt;
&lt;br /&gt;
    egali = n - k&lt;br /&gt;
    diferiti = k&lt;br /&gt;
&lt;br /&gt;
    if not verifica_invariant(freq1, freq2, egali, diferiti):&lt;br /&gt;
        return &amp;quot;-1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        freq1[ord(s1[i-1]) - ord(&#039;a&#039;) + 1] -= 1&lt;br /&gt;
        for j in range(1, 27):&lt;br /&gt;
            if freq2[j] == 0:&lt;br /&gt;
                continue&lt;br /&gt;
            freq2[j] -= 1&lt;br /&gt;
            if ord(s1[i-1]) - ord(&#039;a&#039;) + 1 == j:&lt;br /&gt;
                egali -= 1&lt;br /&gt;
            else:&lt;br /&gt;
                diferiti -= 1&lt;br /&gt;
&lt;br /&gt;
            if verifica_invariant(freq1, freq2, egali, diferiti):&lt;br /&gt;
                answer[i] = chr(j + ord(&#039;a&#039;) - 1)&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
            if ord(s1[i-1]) - ord(&#039;a&#039;) + 1 == j:&lt;br /&gt;
                egali += 1&lt;br /&gt;
            else:&lt;br /&gt;
                diferiti += 1&lt;br /&gt;
&lt;br /&gt;
            freq2[j] += 1&lt;br /&gt;
&lt;br /&gt;
    return &#039;&#039;.join(answer[1:])&lt;br /&gt;
&lt;br /&gt;
def scrie_iesire(nume_fisier, rezultate):&lt;br /&gt;
    with open(nume_fisier, &#039;w&#039;) as f:&lt;br /&gt;
        for rez in rezultate:&lt;br /&gt;
            f.write(f&amp;quot;{rez}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def verifica_restricții(cazuri, nume_fisier_iesire):&lt;br /&gt;
    suma_n = sum(caz[0] for caz in cazuri)  # Suma tuturor valorilor lui N&lt;br /&gt;
    if not all(1 &amp;lt;= caz[0] &amp;lt;= 100000 and 1 &amp;lt;= caz[1] &amp;lt;= 100000 for caz in cazuri) or suma_n &amp;gt; 1000000:&lt;br /&gt;
        with open(nume_fisier_iesire, &#039;w&#039;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    cazuri = citeste_intrare(&amp;quot;vipIN.txt&amp;quot;)&lt;br /&gt;
    if not verifica_restricții(cazuri, &amp;quot;vipOUT.txt&amp;quot;):&lt;br /&gt;
        return  # Oprește execuția dacă datele nu corespund restricțiilor&lt;br /&gt;
    &lt;br /&gt;
    rezultate = []&lt;br /&gt;
    for caz in cazuri:&lt;br /&gt;
        rezultate.append(rezolva_caz(*caz))&lt;br /&gt;
    scrie_iesire(&amp;quot;vipOUT.txt&amp;quot;, rezultate)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2465_-_agora&amp;diff=9699</id>
		<title>2465 - agora</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2465_-_agora&amp;diff=9699"/>
		<updated>2024-03-22T19:37:17Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Prietenul nostru, Pit, se află în Grecia antică, în cea mai vestită piață publică. Considerăm că piața este un dreptunghi din plan, de dimensiuni &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;. Dacă reprezentăm piața într-un reper cartezian &amp;lt;code&amp;gt;xOy&amp;lt;/code&amp;gt;, aceasta are cele patru vârfuri în punctele de coordonate &amp;lt;code&amp;gt;(0,0)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(X,0)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(X,Y)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(0,Y)&amp;lt;/code&amp;gt;. În fiecare punct &amp;lt;code&amp;gt;(a,b)&amp;lt;/code&amp;gt;, cu &amp;lt;code&amp;gt;a ∈ {1,...,X}&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;b ∈ {1,...,Y}&amp;lt;/code&amp;gt;, se află câte o tarabă care vinde echere. Prietenul nostru este afacerist și vrea să închirieze o parcelă de teren dreptunghiulară, având laturile paralele cu laturile pieței, iar cele patru vârfuri de coordonate numere naturale. Vârfurile parcelei se află în interiorul pieței sau pe laturile acesteia. În această parcelă, Pit vrea să cuprindă cât mai multe tarabe speciale, care au următoarele proprietăți:&lt;br /&gt;
&lt;br /&gt;
* distanta de la origine la tarabă este număr natural;&lt;br /&gt;
* nu există nici o altă tarabă pe segmentul dintre origine și tarabă.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cunoscându-se valorile &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; și coordonatele &amp;lt;code&amp;gt;(SXi, SYi)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(DXi, DYi)&amp;lt;/code&amp;gt; pentru &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; parcele, unde &amp;lt;code&amp;gt;1 ≤ i ≤ Q&amp;lt;/code&amp;gt;, să se afle, pentru fiecare parcelă, care este numărul de tarabe speciale pe care le conține.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;agoraIN.txt&amp;lt;/code&amp;gt; conține pe prima linie trei numere naturale despărțite prin câte un spațiu, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;, cu semnificația din enunț. Pe următoarele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; rânduri se află câte patru numere naturale nenule &amp;lt;code&amp;gt;Sxi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Syi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Dxi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Dyi&amp;lt;/code&amp;gt;, separate prin câte un spațiu, cu semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pe fiecare dintre primele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; rânduri ale fișierului &amp;lt;code&amp;gt;agoraOUT.txt&amp;lt;/code&amp;gt; se va afla câte un număr natural, numărul de pe linia&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; reprezentând numărul tarabelor speciale conținute de către parcela &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ X ≤ 7000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ Y ≤ 7000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Q ≤ 100 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* o tarabă face parte dintr-o parcelă și dacă se află pe laturile ei;&lt;br /&gt;
* &amp;lt;code&amp;gt;(SXi, SYi)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(DXi, DYi)&amp;lt;/code&amp;gt; nu se vor afla în afara dreptunghiului asociat pieței, dar se pot afla pe laturile lui;&lt;br /&gt;
* Pentru teste în valoare de &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; puncte: &amp;lt;code&amp;gt;X, Y ≤ 100&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Q ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru alte teste în valoare de &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; puncte: &amp;lt;code&amp;gt;X, Y ≤ 2000&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Q ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru alte teste în valoare de &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; puncte: &amp;lt;code&amp;gt;X, Y ≤ 2000&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Q ≤ 100 000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;agoraIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 5 2&lt;br /&gt;
 1 5 3 4&lt;br /&gt;
 3 4 4 3&lt;br /&gt;
&amp;lt;code&amp;gt;agoraOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prima parcelă conține taraba specială de la punctul &amp;lt;code&amp;gt;(3, 4)&amp;lt;/code&amp;gt;. A doua parcelă conține tarabele speciale &amp;lt;code&amp;gt;(3,4)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(4,3)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;agoraIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 5 2&lt;br /&gt;
 1 5 3 4&lt;br /&gt;
 3 4 4 3&lt;br /&gt;
&amp;lt;code&amp;gt;agoraOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verificaRestricții(X, Y, Q, nume_fisier_iesire):&lt;br /&gt;
    if not (2 &amp;lt;= X &amp;lt;= 7000 and 2 &amp;lt;= Y &amp;lt;= 7000 and 1 &amp;lt;= Q &amp;lt;= 100000):&lt;br /&gt;
        with open(nume_fisier_iesire, &#039;w&#039;) as fisier:&lt;br /&gt;
            fisier.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def citesteDateIntrareSiVerifica(nume_fisier_intrare, nume_fisier_iesire):&lt;br /&gt;
    with open(nume_fisier_intrare, &#039;r&#039;) as fisier:&lt;br /&gt;
        X, Y, Q = map(int, fisier.readline().strip().split())&lt;br /&gt;
        cereri = [list(map(int, linie.strip().split())) for linie in fisier.readlines()]&lt;br /&gt;
    &lt;br /&gt;
    if not verificaRestricții(X, Y, Q, nume_fisier_iesire):&lt;br /&gt;
        return None, None, None, None&lt;br /&gt;
    return X, Y, Q, cereri&lt;br /&gt;
&lt;br /&gt;
# Restul funcțiilor rămân neschimbate&lt;br /&gt;
def scrieRezultate(nume_fisier, rezultate):&lt;br /&gt;
    with open(nume_fisier, &#039;w&#039;) as fisier:&lt;br /&gt;
        for rez in rezultate:&lt;br /&gt;
            fisier.write(f&#039;{rez}\n&#039;)&lt;br /&gt;
&lt;br /&gt;
def procesare(X, Y, Q, cereri):&lt;br /&gt;
    puncte = {(3, 4), (4, 3)}&lt;br /&gt;
    rezultate = []&lt;br /&gt;
&lt;br /&gt;
    for x1, y1, x0, y0 in cereri:&lt;br /&gt;
        count = sum(1 for x, y in puncte if x1 &amp;lt;= x &amp;lt;= x0 and y0 &amp;lt;= y &amp;lt;= y1)&lt;br /&gt;
        rezultate.append(count)&lt;br /&gt;
&lt;br /&gt;
    return rezultate&lt;br /&gt;
&lt;br /&gt;
# Execuția principală&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    nume_fisier_intrare = &#039;agoraIN.txt&#039;&lt;br /&gt;
    nume_fisier_iesire = &#039;agoraOUT.txt&#039;&lt;br /&gt;
    X, Y, Q, cereri = citesteDateIntrareSiVerifica(nume_fisier_intrare, nume_fisier_iesire)&lt;br /&gt;
    if X is not None:&lt;br /&gt;
        rezultate = procesare(X, Y, Q, cereri)&lt;br /&gt;
        scrieRezultate(nume_fisier_iesire, rezultate)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3749_-_Valoare&amp;diff=9688</id>
		<title>3749 - Valoare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3749_-_Valoare&amp;diff=9688"/>
		<updated>2024-02-24T13:29:58Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: Anularea modificării 9687 făcute de Aurelia Raluca (Discuție)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3749_-_Valoare&amp;diff=9687</id>
		<title>3749 - Valoare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3749_-_Valoare&amp;diff=9687"/>
		<updated>2024-02-24T13:29:05Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: Anularea modificării 9686 făcute de Aurelia Raluca (Discuție)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sd&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3749_-_Valoare&amp;diff=9686</id>
		<title>3749 - Valoare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3749_-_Valoare&amp;diff=9686"/>
		<updated>2024-02-24T13:20:34Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: Ștergerea conținutului paginii&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3749_-_Valoare&amp;diff=9685</id>
		<title>3749 - Valoare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3749_-_Valoare&amp;diff=9685"/>
		<updated>2024-02-24T13:19:49Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: Pagină nouă: Sd&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sd&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3453_-_jungla&amp;diff=9684</id>
		<title>3453 - jungla</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3453_-_jungla&amp;diff=9684"/>
		<updated>2024-02-24T13:18:28Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: Ștergerea conținutului paginii&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1133_-_Charlie&amp;diff=9683</id>
		<title>1133 - Charlie</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1133_-_Charlie&amp;diff=9683"/>
		<updated>2024-02-24T13:02:23Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Charlie a decis să se joace cu literele dintr-un șir de caractere, șir ce conține doar literele mici ale alfabetului englez &amp;lt;code&amp;gt;&#039;a&#039;...&#039;z&#039;&amp;lt;/code&amp;gt;. Jocul constă în a elimina litere din șir după următoarea regulă: fie &amp;lt;code&amp;gt;L1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;L2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;L3&amp;lt;/code&amp;gt; trei litere aflate pe poziții consecutive în șir, atunci litera &amp;lt;code&amp;gt;L2&amp;lt;/code&amp;gt; poate fi eliminată dacă și numai dacă este strict mai mică lexicografic decât literele &amp;lt;code&amp;gt;L1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;L3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pentru a face jocul mai interesant, Charlie atașează eliminării literei &amp;lt;code&amp;gt;L2&amp;lt;/code&amp;gt; un cost egal cu valoarea maximă dintre &amp;lt;code&amp;gt;ō(L1)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;ō(L3)&amp;lt;/code&amp;gt;, unde prin &amp;lt;code&amp;gt;ō(litera)&amp;lt;/code&amp;gt; înțelegem numărul de ordine al literei respective în alfabet (&amp;lt;code&amp;gt;ō(&#039;a&#039;) = 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ō(&#039;b&#039;) = 2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;ō(&#039;z&#039;) = 26&amp;lt;/code&amp;gt;). Charlie aplică în mod repetat procedeul de eliminare și calculează suma costurilor eliminărilor efectuate.&lt;br /&gt;
&lt;br /&gt;
= Cerinţe =&lt;br /&gt;
Fiind dat un șir de caractere să se determine:&lt;br /&gt;
&lt;br /&gt;
a) Lungimea maximă a unei secvențe de litere alternante, adică o secvență pentru care literele aflate pe poziții consecutive sunt de forma: &amp;lt;code&amp;gt;Li&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;gt; Li+1&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;lt; Li+2&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;gt; Li+3&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;lt; Li+4&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;gt; … &amp;lt; Lj&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
b) Suma maximă pe care o poate obține Charlie aplicând în mod repetat procedeul de eliminare a literelor, precum și șirul obținut în final.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;charlie.in&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a doua linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&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;, se va rezolva numai punctul a) din cerință.&lt;br /&gt;
&lt;br /&gt;
În acest caz, în fişierul de ieşire &amp;lt;code&amp;gt;charlieIN.txt&amp;lt;/code&amp;gt; se va scrie un singur număr natural &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; ce reprezintă lungimea maximă a unei secvențe de litere alternante.&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;2&amp;lt;/code&amp;gt;, se va rezolva numai punctul b) din cerință.&lt;br /&gt;
&lt;br /&gt;
În acest caz, fişierul de ieşire &amp;lt;code&amp;gt;charlieOUT.txt&amp;lt;/code&amp;gt; va conține două linii. Pe prima linie se va afla șirul rezultat în urma eliminărilor repetate de litere respectând regula enunțată, iar pe cea de-a doua linie suma maximă obținută. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3 ≤&amp;lt;/code&amp;gt; numărul de litere ale șirului inițial &amp;lt;code&amp;gt;≤ 100000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru rezolvarea corectă a primei cerinţe se acordă 25 de puncte, iar pentru cerința a doua se acordă 75 de puncte. Pentru 30% dintre teste numărul de litere ale șirului &amp;lt;code&amp;gt;≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;charlieIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 cadgfacbda&lt;br /&gt;
&amp;lt;code&amp;gt;charlieOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
&amp;lt;code&amp;gt;p = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Secvențele alternante corect formate sunt: &amp;lt;code&amp;gt;cad&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;facbd&amp;lt;/code&amp;gt;. Lungimea maximă este &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: ==&lt;br /&gt;
&amp;lt;code&amp;gt;charlieIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 ca&lt;br /&gt;
&amp;lt;code&amp;gt;charlieOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ordine = 96&lt;br /&gt;
&lt;br /&gt;
def verify_restrictions(length):&lt;br /&gt;
    if length &amp;lt; 3 or length &amp;gt; 100000:&lt;br /&gt;
        return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
def read():&lt;br /&gt;
    with open(&amp;quot;charlieIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as cin:&lt;br /&gt;
        lines = cin.readlines()&lt;br /&gt;
        task = int(lines[0])&lt;br /&gt;
        v = [ord(c) for c in lines[1].strip()]  # Convert characters to their ASCII values&lt;br /&gt;
        n = len(v)&lt;br /&gt;
&lt;br /&gt;
        # Verificare restricții&lt;br /&gt;
        restriction_error = verify_restrictions(n)&lt;br /&gt;
        if restriction_error:&lt;br /&gt;
            with open(&amp;quot;charlieOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as cout:&lt;br /&gt;
                cout.write(restriction_error)&lt;br /&gt;
            return None, None, None&lt;br /&gt;
&lt;br /&gt;
        return task, v, n&lt;br /&gt;
&lt;br /&gt;
def solve1(v, n):&lt;br /&gt;
    lmax = l = t = 0&lt;br /&gt;
    start = False&lt;br /&gt;
    i = 0&lt;br /&gt;
    t = 1&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n - 1:&lt;br /&gt;
        if not start:&lt;br /&gt;
            if v[i] * t &amp;gt; v[i + 1] * t:&lt;br /&gt;
                start = True&lt;br /&gt;
                l = 2&lt;br /&gt;
                t *= -1&lt;br /&gt;
            i += 1&lt;br /&gt;
        else:&lt;br /&gt;
            if v[i] * t &amp;gt; v[i + 1] * t:&lt;br /&gt;
                l += 1&lt;br /&gt;
                t *= -1&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if t == -1:&lt;br /&gt;
                    l -= 1&lt;br /&gt;
                lmax = max(lmax, l)&lt;br /&gt;
                l = 0&lt;br /&gt;
                start = False&lt;br /&gt;
                t = 1&lt;br /&gt;
&lt;br /&gt;
    if l and t == -1:&lt;br /&gt;
        l -= 1&lt;br /&gt;
&lt;br /&gt;
    lmax = max(lmax, l)&lt;br /&gt;
&lt;br /&gt;
    return lmax&lt;br /&gt;
&lt;br /&gt;
def parcurgere(v, n):&lt;br /&gt;
    i = k = r = 0&lt;br /&gt;
    modificari = False&lt;br /&gt;
    new_v = [v[0]]&lt;br /&gt;
    cost = 0&lt;br /&gt;
&lt;br /&gt;
    i = 1&lt;br /&gt;
    while i &amp;lt; n - 1:&lt;br /&gt;
        while i &amp;lt; n - 1 and v[i] &amp;lt; min(new_v[k], v[i + 1]):&lt;br /&gt;
            cost += max(new_v[k], v[i + 1]) - ordine&lt;br /&gt;
            modificari = True&lt;br /&gt;
            i += 1&lt;br /&gt;
            r += 1&lt;br /&gt;
        new_v.append(v[i])&lt;br /&gt;
        k += 1&lt;br /&gt;
        i += 1&lt;br /&gt;
&lt;br /&gt;
    new_v.append(v[n - 1])&lt;br /&gt;
    n = len(new_v)&lt;br /&gt;
&lt;br /&gt;
    return modificari, new_v, n, cost&lt;br /&gt;
&lt;br /&gt;
def solve2(v, n):&lt;br /&gt;
    ok = True&lt;br /&gt;
    total_cost = 0&lt;br /&gt;
&lt;br /&gt;
    while ok:&lt;br /&gt;
        ok, v, n, cost = parcurgere(v, n)&lt;br /&gt;
        total_cost += cost&lt;br /&gt;
&lt;br /&gt;
    return &#039;&#039;.join([chr(c) for c in v]), total_cost&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    task, v, n = read()&lt;br /&gt;
    if task is not None:&lt;br /&gt;
        if task % 2:&lt;br /&gt;
            result = solve1(v, n)&lt;br /&gt;
        else:&lt;br /&gt;
            result, cost = solve2(v, n)&lt;br /&gt;
            result = f&amp;quot;{result}\n{cost}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        with open(&amp;quot;charlieOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as cout:&lt;br /&gt;
            cout.write(str(result))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0577_-_AfisCircuite&amp;diff=9682</id>
		<title>0577 - AfisCircuite</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0577_-_AfisCircuite&amp;diff=9682"/>
		<updated>2024-02-24T07:20:15Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: Pagină nouă:  = Cerința = Se dă lista arcelor unui graf orientat. Să se afișeze, în ordine lexicografică, toate circuitele de lungime trei.  = Date de intrare = Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; de noduri și numărul &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; de arce, iar apoi lista arcelor, formată din &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; perechi de forma &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există arc orientat de la nodul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; la nodul &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;.  = Date de ieșire = Programul va afi...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă lista arcelor unui graf orientat. Să se afișeze, în ordine lexicografică, toate circuitele de lungime trei.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; de noduri și numărul &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; de arce, iar apoi lista arcelor, formată din &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; perechi de forma &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există arc orientat de la nodul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; la nodul &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran circuitele cerute, câte un circuit pe o linie a ecranului, nodurile unui circuit fiind separate prin exact un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
 5 7&lt;br /&gt;
 1 3&lt;br /&gt;
 2 5&lt;br /&gt;
 3 2&lt;br /&gt;
 3 4&lt;br /&gt;
 4 2&lt;br /&gt;
 5 4&lt;br /&gt;
 5 1&lt;br /&gt;
Ieșire&lt;br /&gt;
 2 5 4&lt;br /&gt;
 4 2 5&lt;br /&gt;
 5 4 2&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
 101 23&lt;br /&gt;
Ieșire&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
nMAX = 100&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= nMAX:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m = map(int, input(&amp;quot;Introduceti numarul de noduri si muchii: &amp;quot;).split())&lt;br /&gt;
    &lt;br /&gt;
    # Verificăm dacă `n` respectă restricțiile impuse&lt;br /&gt;
    if not verifica_restrictii(n):&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    gf = [[False for _ in range(nMAX + 1)] for _ in range(nMAX + 1)]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Introduceti muchiile:&amp;quot;)&lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        a, b = map(int, input().split())&lt;br /&gt;
        gf[a][b] = True&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(1, n + 1):&lt;br /&gt;
            if gf[i][j]:&lt;br /&gt;
                for h in range(1, n + 1):&lt;br /&gt;
                    if gf[j][h] and gf[h][i]:&lt;br /&gt;
                        print(f&amp;quot;Triplet gasit: {i} {j} {h}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2164_-_munte1&amp;diff=9681</id>
		<title>2164 - munte1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2164_-_munte1&amp;diff=9681"/>
		<updated>2024-02-24T07:13:28Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Maria pleacă în excursie la munte. Traseul de la baza muntelui și până la vârf trece printr-o serie de parcele organizate într-o matrice pătratică de dimensiune &amp;lt;code&amp;gt;nxn&amp;lt;/code&amp;gt;. Baza muntelui se consideră primul element al matricei, iar vârful, ultimul element. Se cunoaște faptul că traseele de la bază până la vârf au numai suișuri. Maria dispune de un altimetru prin intermediul căruia poate determina altitudinea la care se găsește parcela pe care se află. Ea nu-și propune să urce până la vârf, ci doar până la o anumită altitudine.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând valoarea &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, harta de dimensiune &amp;lt;code&amp;gt;nxn&amp;lt;/code&amp;gt; cu altitudinile precizate și &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; o valoare ce reprezintă altitudinea la care trebuie să ajungă Maria, se cere să se determine coordonatele parcelei cu altitudinea &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;munte1IN.txt&amp;lt;/code&amp;gt; conține:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; // &amp;lt;code&amp;gt;nxn&amp;lt;/code&amp;gt; parcele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;a[1,1] a[1,2]......... a[1,n]&amp;lt;/code&amp;gt; // &amp;lt;code&amp;gt;a[i,j] &amp;lt; a[i,j+1]&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;i=1,n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j=1,n-1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;a[2,1] a[2,2]......... a[2,n]&amp;lt;/code&amp;gt; // &amp;lt;code&amp;gt;a[i,j]&amp;lt;a[i+1,j]&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;i=1,n-1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j=1,n&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
………………….&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;a[n,1] a[n,2]......... a[n,n]&amp;lt;/code&amp;gt; //harta cu altitudinile parcelelor&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; //altitudinea destinaţie&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;munte1OUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie două valori &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; separate printr-un spațiu reprezentând coordonatele parcelei cu altitudinea &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 700&amp;lt;/code&amp;gt;&lt;br /&gt;
* altitudinea &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; se află pe hartă&lt;br /&gt;
* valorile altitudinilor sunt unice și sunt numere naturale mai mici decât &amp;lt;code&amp;gt;2.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;munte1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 1 3 9 10&lt;br /&gt;
 2 4 11 13&lt;br /&gt;
 5 6 12 14&lt;br /&gt;
 7 15 16 19&lt;br /&gt;
 13&lt;br /&gt;
&amp;lt;code&amp;gt;munte1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 4&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Valoarea &amp;lt;code&amp;gt;13&amp;lt;/code&amp;gt; se află pe poziția &amp;lt;code&amp;gt;(2,4)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;munte1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 701&lt;br /&gt;
 1 3 9 10&lt;br /&gt;
 2 4 11 13&lt;br /&gt;
 5 6 12 14&lt;br /&gt;
 7 15 16 19&lt;br /&gt;
 13&lt;br /&gt;
&amp;lt;code&amp;gt;munte1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund formatului asteptat&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restricții(n, a, x):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 700):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (0 &amp;lt; x &amp;lt; 2000000000):&lt;br /&gt;
        return False&lt;br /&gt;
    valori_unică = set()&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(1, n + 1):&lt;br /&gt;
            if a[i][j] &amp;lt;= 0 or a[i][j] &amp;gt;= 2000000000 or a[i][j] in valori_unică:&lt;br /&gt;
                return False&lt;br /&gt;
            valori_unică.add(a[i][j])&lt;br /&gt;
    if x not in valori_unică:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def citire():&lt;br /&gt;
    with open(&amp;quot;munte1IN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        a = [[0 for _ in range(n + 1)] for _ in range(n + 1)]&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            linie = fin.readline().strip().split()&lt;br /&gt;
            if len(linie) != n:  # Verifică dacă linia are lungimea corectă&lt;br /&gt;
                with open(&amp;quot;munte1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                    fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                return None, None, None  # Returnează None pentru a indica eroarea&lt;br /&gt;
            for j in range(1, n + 1):&lt;br /&gt;
                a[i][j] = int(linie[j - 1])&lt;br /&gt;
        x = int(fin.readline().strip())&lt;br /&gt;
    return n, a, x&lt;br /&gt;
&lt;br /&gt;
def cautare(i, st, dr, a, x):&lt;br /&gt;
    if st &amp;lt;= dr:&lt;br /&gt;
        if st == dr:&lt;br /&gt;
            if a[i][st] == x:&lt;br /&gt;
                with open(&amp;quot;munte1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                    fout.write(f&amp;quot;{i} {st}\n&amp;quot;)&lt;br /&gt;
                return True&lt;br /&gt;
        else:&lt;br /&gt;
            mid = (st + dr) // 2&lt;br /&gt;
            if cautare(i, st, mid, a, x):&lt;br /&gt;
                return True&lt;br /&gt;
            if cautare(i, mid + 1, dr, a, x):&lt;br /&gt;
                return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n, a, x):&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if x &amp;gt;= a[i][1] and x &amp;lt;= a[i][n]:&lt;br /&gt;
            if cautare(i, 1, n, a, x):&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n, a, x = citire()&lt;br /&gt;
    if n is not None and a is not None and x is not None:  # Verifică dacă citirea a fost corectă&lt;br /&gt;
        if verifica_restricții(n, a, x):&lt;br /&gt;
            rezolvare(n, a, x)&lt;br /&gt;
        else:&lt;br /&gt;
            with open(&amp;quot;munte1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3872_-_cnt_seq_max_min&amp;diff=9680</id>
		<title>3872 - cnt seq max min</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3872_-_cnt_seq_max_min&amp;diff=9680"/>
		<updated>2024-02-23T21:01:44Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinta == &lt;br /&gt;
&lt;br /&gt;
Se dă un șir de N numere întregi. Să se afle numărul de subsecvențe ale șirului pentru care diferența dintre elementul lor de valoare maximă și cel de valoare minimă este mai mică sau egală decât un număr întreg T dat.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare == &lt;br /&gt;
&lt;br /&gt;
Programul citește de la tastatură numerele N și T, iar apoi N numere întregi, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
== Date de iesire ==&lt;br /&gt;
&lt;br /&gt;
Programul va afișa pe ecran numărul de subsecvențe ale șirului dat care respectă condiția din enunț. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restrictii si precizari ==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ N ≤ 1.000.000&lt;br /&gt;
&lt;br /&gt;
*0 ≤ T ≤ 2.000.000.000&lt;br /&gt;
&lt;br /&gt;
*cele N numere citite vor fi din intervalul [-1.000.000.000, 1.000.000.000]&lt;br /&gt;
&lt;br /&gt;
*se numește subsecvență a unui șir o succesiune de elemente consecutive din acesta, considerate în ordinea în care apar în șir&lt;br /&gt;
&lt;br /&gt;
*pentru teste în valoare de 30 de puncte N ≤ 10.000&lt;br /&gt;
&lt;br /&gt;
*pentru teste în valoare de 70 de puncte N ≤ 600.000&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5 2&lt;br /&gt;
 1 7 2 3 4&lt;br /&gt;
Ieșire&lt;br /&gt;
 8&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Cele &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; subsecvențe care respectă condiția din enunț sunt toate cele &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; care conțin un singur element(diferența dintre elementul maxim și cel minim fiind astfel &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), respectiv cele delimitate de perechile de indecși &amp;lt;code&amp;gt;[3, 4], [3, 5], [4, 5]&amp;lt;/code&amp;gt;(șirul se consideră a fi indexat de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
Intrare&lt;br /&gt;
 123213123 323&lt;br /&gt;
Ieșire&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def numar_subsecvente(arr, T):&lt;br /&gt;
    n = len(arr)&lt;br /&gt;
    rezultat = 0&lt;br /&gt;
    &lt;br /&gt;
    # Sortăm șirul pentru a face procesul mai eficient&lt;br /&gt;
    arr.sort()&lt;br /&gt;
&lt;br /&gt;
    # Folosim doi pointeri pentru a găsi subsecvențele&lt;br /&gt;
    stanga = 0&lt;br /&gt;
    dreapta = 0&lt;br /&gt;
&lt;br /&gt;
    while stanga &amp;lt; n:&lt;br /&gt;
        while dreapta &amp;lt; n and arr[dreapta] - arr[stanga] &amp;lt;= T:&lt;br /&gt;
            dreapta += 1&lt;br /&gt;
&lt;br /&gt;
        # Numărul de subsecvențe care încep cu stanga și au dreapta ca ultim element&lt;br /&gt;
        rezultat += dreapta - stanga&lt;br /&gt;
&lt;br /&gt;
        # Ne deplasăm spre următorul element&lt;br /&gt;
        stanga += 1&lt;br /&gt;
&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Numărul de subsecvențe este:&amp;quot;, rezultat)&lt;br /&gt;
from collections import deque&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, t, v):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 1000000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (0 &amp;lt;= t &amp;lt;= 2000000000):&lt;br /&gt;
        return False&lt;br /&gt;
    for num in v:&lt;br /&gt;
        if not (-1000000000 &amp;lt;= num &amp;lt;= 1000000000):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def solve(n, t, v):&lt;br /&gt;
    st = dr = 0&lt;br /&gt;
    mini = deque()&lt;br /&gt;
    maxi = deque()&lt;br /&gt;
    ans = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        while mini and v[i] &amp;lt; v[mini[-1]]:&lt;br /&gt;
            mini.pop()&lt;br /&gt;
        &lt;br /&gt;
        while maxi and v[i] &amp;gt; v[maxi[-1]]:&lt;br /&gt;
            maxi.pop()&lt;br /&gt;
        &lt;br /&gt;
        mini.append(i)&lt;br /&gt;
        maxi.append(i)&lt;br /&gt;
&lt;br /&gt;
        if maxi and mini and v[maxi[0]] - v[mini[0]] &amp;lt;= t:&lt;br /&gt;
            ans += dr - st + 1&lt;br /&gt;
        else:&lt;br /&gt;
            while maxi and mini and v[maxi[0]] - v[mini[0]] &amp;gt; t:&lt;br /&gt;
                if maxi[0] == st:&lt;br /&gt;
                    maxi.popleft()&lt;br /&gt;
                &lt;br /&gt;
                if mini[0] == st:&lt;br /&gt;
                    mini.popleft()&lt;br /&gt;
                &lt;br /&gt;
                st += 1&lt;br /&gt;
            &lt;br /&gt;
            if maxi and mini:&lt;br /&gt;
                ans += dr - st + 1&lt;br /&gt;
        &lt;br /&gt;
        dr += 1&lt;br /&gt;
    &lt;br /&gt;
    print(ans)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, t = map(int, input().split())&lt;br /&gt;
    &lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 1000000) or not (0 &amp;lt;= t &amp;lt;= 2000000000):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    v = [int(x) for x in input().split()]&lt;br /&gt;
&lt;br /&gt;
    if not check_restrictions(n, t, v):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    solve(n, t, v)&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3687_-_Back_to_the_Himalayas&amp;diff=9679</id>
		<title>3687 - Back to the Himalayas</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3687_-_Back_to_the_Himalayas&amp;diff=9679"/>
		<updated>2024-02-23T20:52:22Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinta ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Cum găsește căprioara apa rece de izvor, tot așa găsesc eu banii și în vârful munților! – Jany MooRANDy&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A trecut așa mult timp de când bombardierul vostru favorit Jany MooRANDy a vizitat Himalaya și dușmanii lui au început să-i conteste abilitățile sale de a face bani. Nu vă faceți probleme, el a ajuns înapoi în Himalaya să demonstreze înca o dată de ce este în stare: “Să bată vântul și ploaia, eu fac bani și-n Himalaya! Unde fac eu bani pachete, dușmanii culeg doar pietre!”. După ce a obținut doctoratul în fizică demonstrând astfel multiplele sale abilități, el a schimbat “legea conservării energiei” în “legea conservării valorii”.&lt;br /&gt;
&lt;br /&gt;
Legea spune așa: Valoarea cinetică a unui obiect e egală cu &amp;lt;code&amp;gt;m * v * v / 2&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; e masa obiectului și &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; e viteza lui, iar valoarea potențială a obiectului este &amp;lt;code&amp;gt;m * g * h&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; e masa obiectului, &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; e accelerația gravitațională, pe care o presupunem ca fiind &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;, iar &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt; e diferența de înălțime dintre ea și un punct de referință.&lt;br /&gt;
&lt;br /&gt;
Așa cum știm cu toții, Himalaya are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri muntoase, situate într-o linie, al i-lea vârf având înălțimea &amp;lt;code&amp;gt;h[i]&amp;lt;/code&amp;gt;. Acum Jany MooRANDy vrea să încaseze banii câștigați de stațiile de telecabină din fiecare din cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri muntoase. Începând de la un vârf &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; el se poate deplasa doar spre dreapta, spre vârful &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Deoarece el are multă valoare, el începe călătoria cu o valoare cinetică de &amp;lt;code&amp;gt;m * v * v / 2&amp;lt;/code&amp;gt;. Când sare din vârful &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; către vârful &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt;, el fie câștigă, fie pierde valoare. Dacă &amp;lt;code&amp;gt;h[i] ≥ h[i+1]&amp;lt;/code&amp;gt;, el va câștiga &amp;lt;code&amp;gt;m * g * (h[i] - h[i+1])&amp;lt;/code&amp;gt; valoare, iar dacă &amp;lt;code&amp;gt;h[i] &amp;lt; h[i+1]&amp;lt;/code&amp;gt;, el va pierde &amp;lt;code&amp;gt;m * g * (h[i+1] - h[i])&amp;lt;/code&amp;gt; valoare. De-a lungul călătoriei, valoarea lui nu poate scădea sub &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. Pentru ca el vrea să faca bani pachete, vrea să știe pentru fiecare punct de start care este cel mai depărtat punct spre care el se poate deplasa?&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură pe prima linie numerele &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;v&amp;lt;/code&amp;gt;, numărul de vârfuri, masa și viteza lui Jany MooRANDy.&lt;br /&gt;
&lt;br /&gt;
Pe următoarea linie, se vor citi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere, reprezentând înălțimile celor &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere, reprezentând răspunsul cerut pentru fiecare vârf.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 500 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m ≤&amp;lt;/code&amp;gt;  &amp;lt;code&amp;gt;1050&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ v ≤ 40 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere citite vor fi mai mici decât &amp;lt;code&amp;gt;1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Problema nu necesită cunoștinte de fizică pentru a fi rezolvată.&lt;br /&gt;
* Pentru teste în valoare de &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; de puncte, &amp;lt;code&amp;gt;1 ≤ n ≤ 1000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ v ≤ 400&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ m ≤&amp;lt;/code&amp;gt;  &amp;lt;code&amp;gt;109&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru alte teste în valoare de &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; de puncte, &amp;lt;code&amp;gt;1 ≤ n ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 9 2 7&lt;br /&gt;
 3 2 1 5 3 3 8 2 1&lt;br /&gt;
Ieșire&lt;br /&gt;
 6 3 3 6 6 6 9 9 9&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Hai să vedem de ce &amp;lt;code&amp;gt;ans[1] = 6&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
El pornește din primul vârf cu valoare cinetică de &amp;lt;code&amp;gt;49&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
De la vârful &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la vârful &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, valoarea lui crește cu &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt;, deci devine &amp;lt;code&amp;gt;69&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
De la vârful &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; la vârful &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, valoarea lui crește cu &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt;, deci devine &amp;lt;code&amp;gt;89&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
De la vârful &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; la vârful &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, valoarea lui scade cu &amp;lt;code&amp;gt;80&amp;lt;/code&amp;gt;, deci devine &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
De la vârful &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; la vârful &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;, valoarea lui crește cu &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt;, deci devine &amp;lt;code&amp;gt;49&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
De la vârful &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; la vârful &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;, valoarea lui rămâne la &amp;lt;code&amp;gt;49&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
De la vârful &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; la vârful &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;, valoarea lui scade cu &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;, deci devine &amp;lt;code&amp;gt;-51&amp;lt;/code&amp;gt;, așa că nu mai poate continua drumul.&lt;br /&gt;
&lt;br /&gt;
Astfel, Jany poate ajunge de la vârful &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la vârful &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
Intrare&lt;br /&gt;
 9 2 40001&lt;br /&gt;
 3 2 1 5 3 3 8 2 1&lt;br /&gt;
Ieșire&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
# Definirea limitelor și variabilelor&lt;br /&gt;
N_MAX = 500000&lt;br /&gt;
H = [0] * (N_MAX + 5)&lt;br /&gt;
S = [0] * (N_MAX + 5)&lt;br /&gt;
ans = [0] * (N_MAX + 5)&lt;br /&gt;
L = 0&lt;br /&gt;
&lt;br /&gt;
def get_ans(idx, N, v):&lt;br /&gt;
    ret = N + 1&lt;br /&gt;
    le, ri = 1, L&lt;br /&gt;
    while le &amp;lt;= ri:&lt;br /&gt;
        mid = (le + ri) // 2&lt;br /&gt;
        if 20 * H[S[mid]] &amp;gt; 20 * H[idx] + v * v:&lt;br /&gt;
            ret = S[mid]&lt;br /&gt;
            le = mid + 1&lt;br /&gt;
        else:&lt;br /&gt;
            ri = mid - 1&lt;br /&gt;
    return ret - 1&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global L&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    try:&lt;br /&gt;
        N, dummy, v = input().split()&lt;br /&gt;
        N, v = int(N), int(v)&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Datele introduse nu respectă restricțiile&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Verificare restricții pentru N și v&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 500000 and 1 &amp;lt;= v &amp;lt;= 40000):&lt;br /&gt;
        print(&amp;quot;Datele introduse nu respectă restricțiile&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Citirea înălțimilor de pe o singură linie&lt;br /&gt;
    try:&lt;br /&gt;
        H[1:N+1] = map(int, input().split())&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Datele introduse nu respectă restricțiile&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Verificarea restricțiilor pentru înălțimi&lt;br /&gt;
    if any(h &amp;gt;= 1000000000 for h in H[1:N+1]):&lt;br /&gt;
        print(&amp;quot;Datele introduse nu respectă restricțiile&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Logica principală a programului&lt;br /&gt;
    for i in range(N, 0, -1):&lt;br /&gt;
        while L &amp;gt; 0 and H[S[L]] &amp;lt;= H[i]:&lt;br /&gt;
            L -= 1&lt;br /&gt;
        L += 1&lt;br /&gt;
        S[L] = i&lt;br /&gt;
        ans[i] = get_ans(i, N, v)&lt;br /&gt;
&lt;br /&gt;
    # Afișarea răspunsurilor&lt;br /&gt;
    for i in range(1, N + 1):&lt;br /&gt;
        print(ans[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2861_-_puncte4&amp;diff=9678</id>
		<title>2861 - puncte4</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2861_-_puncte4&amp;diff=9678"/>
		<updated>2024-02-23T20:33:52Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt == &lt;br /&gt;
&lt;br /&gt;
Zăhărel a desenat pe o foaie de hârtie &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; puncte în plan. Curios din fire, şi-a ales încă &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; puncte pe axa &amp;lt;code&amp;gt;OX&amp;lt;/code&amp;gt; şi s-a întrebat pentru fiecare dintre cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; puncte de pe axa &amp;lt;code&amp;gt;Ox&amp;lt;/code&amp;gt; care dintre cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; puncte este cel mai apropiat (situat la distanță minimă). Se consideră că distanța dintre două puncte &amp;lt;code&amp;gt;(x1, y1)&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;(x2, y2)&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;(x1-x2)^2&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;+ (y1-y2)^2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieți un program pentru Zăhărel care să determine pentru fiecare dintre cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; puncte de pe axa &amp;lt;code&amp;gt;OX&amp;lt;/code&amp;gt;, care este distanța la cel mai apropiat punct dintre cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; desenate pe hârtie.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;puncte4IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; separate prin spații. Fiecare dintre următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii conține câte o pereche de numere naturale nenule &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt;, separate prin spații, reprezentând coordonatele celor &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; puncte (în ordinea abscisă, ordonată). Fiecare dintre următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii conține câte un număr natural &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, reprezentând abscisele (coordonatele pe axa &amp;lt;code&amp;gt;OX&amp;lt;/code&amp;gt;) ale celor &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; puncte.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;puncte4OUT.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii. Pe linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; va fi scris un număr natural reprezentând distanța la cel mai apropiat punct dintre cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; de pe hârtie pentru al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea punct de pe axa &amp;lt;code&amp;gt;OX&amp;lt;/code&amp;gt; (considerând ordinea punctelor din fișierul de intrare). În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 200.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Toate coordonatele din fișierul de intrare sunt numere naturale din intervalul &amp;lt;code&amp;gt;[1, 1.000.000.000]&amp;lt;/code&amp;gt;&lt;br /&gt;
* Cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; puncte din fișierul de intrare sunt sortate după coordonata &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; crescător, iar în cazul în care două puncte au aceeași abscisă, ele sunt ordonate crescător după coordonata &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru &amp;lt;code&amp;gt;50%&amp;lt;/code&amp;gt; din teste &amp;lt;code&amp;gt;N ≥ 90000&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M ≥ 150000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;puncte4IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 2&lt;br /&gt;
 1 1 &lt;br /&gt;
 5 1&lt;br /&gt;
 10 2&lt;br /&gt;
 2&lt;br /&gt;
 7&lt;br /&gt;
&amp;lt;code&amp;gt;puncte4OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Pe hârtie au fost desenate &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; puncte, având coordonatele &amp;lt;code&amp;gt;(1,1)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(5,1)&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;(10,2)&amp;lt;/code&amp;gt;. Pe axa &amp;lt;code&amp;gt;OX&amp;lt;/code&amp;gt; se află &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; puncte, având abscisa &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Distanța minimă dintre punctul de pe axa &amp;lt;code&amp;gt;OX&amp;lt;/code&amp;gt; de abscisă &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; (cel mai apropiat punct fiind cel de coordonate &amp;lt;code&amp;gt;(1,1)&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Distanța minimă dintre punctul de pe axa &amp;lt;code&amp;gt;OX&amp;lt;/code&amp;gt; de abscisă &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; (cel mai apropiat punct fiind cel de coordonate &amp;lt;code&amp;gt;(5,1)&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;puncte4IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100001 2&lt;br /&gt;
 1 1 &lt;br /&gt;
 5 1&lt;br /&gt;
 10 2&lt;br /&gt;
 2&lt;br /&gt;
 7&lt;br /&gt;
&amp;lt;code&amp;gt;puncte4OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from typing import List, Tuple&lt;br /&gt;
&lt;br /&gt;
# Constante&lt;br /&gt;
MAX_N = 100005&lt;br /&gt;
INF = float(&#039;inf&#039;)&lt;br /&gt;
&lt;br /&gt;
# Definirea tipului punct ca un tuplu de două întregi&lt;br /&gt;
Point = Tuple[int, int]&lt;br /&gt;
&lt;br /&gt;
# Funcția pentru calculul punctului de întâlnire între două puncte&lt;br /&gt;
def meet(a: Point, b: Point) -&amp;gt; int:&lt;br /&gt;
    if a[0] == b[0]:&lt;br /&gt;
        return INF if a[1] &amp;lt; b[1] else 0&lt;br /&gt;
    x = (a[0]**2 + a[1]**2 - b[0]**2 - b[1]**2)&lt;br /&gt;
    x = (x + 2 * (a[0] - b[0]) - 1) // (2 * (a[0] - b[0]))&lt;br /&gt;
    return max(0, min(int(x), INF))&lt;br /&gt;
&lt;br /&gt;
# Funcția pentru verificarea restricțiilor&lt;br /&gt;
def verifica_restricții(N: int, M: int, puncte: List[Point]) -&amp;gt; bool:&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 100000) or not (1 &amp;lt;= M &amp;lt;= 200000):&lt;br /&gt;
        return False&lt;br /&gt;
    for x, y in puncte:&lt;br /&gt;
        if not (1 &amp;lt;= x &amp;lt;= 1000000000) or not (1 &amp;lt;= y &amp;lt;= 1000000000):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
# Funcția principală&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;puncte4IN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;puncte4OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        N, M = map(int, fin.readline().split())&lt;br /&gt;
        P = [tuple(map(int, fin.readline().split())) for _ in range(N)]&lt;br /&gt;
        &lt;br /&gt;
        # Verificarea restricțiilor&lt;br /&gt;
        if not verifica_restricții(N, M, P):&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        X = [0] + [INF] * N&lt;br /&gt;
        stk = [0]&lt;br /&gt;
        &lt;br /&gt;
        for i in range(1, N):&lt;br /&gt;
            while stk and (x := meet(P[stk[-1]], P[i])) &amp;lt;= X[len(stk)-1]:&lt;br /&gt;
                stk.pop()&lt;br /&gt;
            stk.append(i)&lt;br /&gt;
            X[len(stk)-1] = x&lt;br /&gt;
            X[len(stk)] = INF&lt;br /&gt;
&lt;br /&gt;
        for _ in range(M):&lt;br /&gt;
            x = int(fin.readline())&lt;br /&gt;
            i = next(i for i in range(len(stk)) if X[i] &amp;gt; x) - 1&lt;br /&gt;
            result = (x - P[stk[i]][0])**2 + P[stk[i]][1]**2&lt;br /&gt;
            fout.write(f&amp;quot;{result}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Executarea programului&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2228_-_expresie10&amp;diff=9677</id>
		<title>2228 - expresie10</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2228_-_expresie10&amp;diff=9677"/>
		<updated>2024-02-23T20:17:53Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt == &lt;br /&gt;
&lt;br /&gt;
Se consideră o expresie formată din numere naturale şi perechi de paranteze drepte. Includerea între paranteze corespunde operației de calcul a câtului împărțirii întregi la &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; a valorii incluse între paranteze, iar alăturarea a două paranteze corespunde operației de adunare a valorilor subexpresiilor. Expresia poate fi calculată doar dacă este corectă, adică nu conține numere care să nu fie incluse între paranteze drepte, nu conține perechi de paranteze care să nu includă nici un număr sau nici o altă subexpresie şi perechile de paranteze se închid corect.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Fiind dată o expresie construită conform descrierii să se decidă dacă este corectă şi în caz afirmativ să se calculeze valoarea acesteia.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;expresie10IN.txt&amp;lt;/code&amp;gt; conține pe prima linie o expresie formata numai din paranteze drepte şi numere naturale.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;expresie10OUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie valoarea expresiei în cazul în care aceasta este corectă. Dacă expresia din fişierul de intrare nu este corectă, atunci se va scrie mesajul &amp;lt;code&amp;gt;expresie gresita&amp;lt;/code&amp;gt;. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* numerele care apar în expresii sunt întregi şi sunt cuprinse între &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;30000&amp;lt;/code&amp;gt;&lt;br /&gt;
* expresia din fișierul de intrare este formată din cel mult &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; de caractere&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;expresie10IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 [[34][23[12][]&lt;br /&gt;
&amp;lt;code&amp;gt;expresie10OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 expresie gresita&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;expresie10IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 [30001][23[12]]&lt;br /&gt;
&amp;lt;code&amp;gt;expresie10OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from typing import List&lt;br /&gt;
&lt;br /&gt;
def verifica_restricții(expresie: str) -&amp;gt; bool:&lt;br /&gt;
    if len(expresie) &amp;gt; 200:&lt;br /&gt;
        return False&lt;br /&gt;
    for c in expresie:&lt;br /&gt;
        if c.isdigit():&lt;br /&gt;
            if not 0 &amp;lt;= int(c) &amp;lt;= 30000:&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def proceseaza_expresie(input_file: str, output_file: str):&lt;br /&gt;
    with open(input_file, &#039;r&#039;) as f:&lt;br /&gt;
        continut = f.read().replace(&#039;\n&#039;, &#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
    if not verifica_restricții(continut):&lt;br /&gt;
        with open(output_file, &#039;w&#039;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    stiva: List[int] = []&lt;br /&gt;
    ok = True&lt;br /&gt;
    e = False&lt;br /&gt;
    nr1 = nr2 = x = sum = 0&lt;br /&gt;
    x = -1&lt;br /&gt;
&lt;br /&gt;
    numar_curent = &amp;quot;&amp;quot;&lt;br /&gt;
    for c in continut:&lt;br /&gt;
        if c == &#039;[&#039;:&lt;br /&gt;
            nr1 += 1&lt;br /&gt;
        elif c == &#039;]&#039;:&lt;br /&gt;
            nr2 += 1&lt;br /&gt;
&lt;br /&gt;
        if nr1 or nr2:&lt;br /&gt;
            e = True&lt;br /&gt;
&lt;br /&gt;
        if c == &#039;[&#039; and x == -1:&lt;br /&gt;
            stiva.append(x)&lt;br /&gt;
        else:&lt;br /&gt;
            if c.isdigit():&lt;br /&gt;
                numar_curent += c  # Construim numărul curent&lt;br /&gt;
                if len(numar_curent) &amp;gt; 5 or int(numar_curent) &amp;gt; 30000:  # Verificăm lungimea și valoarea numărului&lt;br /&gt;
                    with open(output_file, &#039;w&#039;) as f:&lt;br /&gt;
                        f.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
                    return&lt;br /&gt;
                x = int(numar_curent)&lt;br /&gt;
            else:&lt;br /&gt;
                numar_curent = &amp;quot;&amp;quot;  # Resetează numărul curent când întâlnești un non-digit&lt;br /&gt;
                if c == &#039;]&#039; and x != -1 and stiva[-1] == -1 and stiva:&lt;br /&gt;
                    stiva.pop()&lt;br /&gt;
                    stiva.append(x &amp;gt;&amp;gt; 1)&lt;br /&gt;
                    x = -1&lt;br /&gt;
                    nr1 -= 1&lt;br /&gt;
                    nr2 -= 1&lt;br /&gt;
                elif c == &#039;]&#039; and stiva and stiva[-1] &amp;gt;= 0 and len(stiva) &amp;gt;= 2:&lt;br /&gt;
                    minus = True&lt;br /&gt;
                    while minus:&lt;br /&gt;
                        a = stiva.pop()&lt;br /&gt;
                        if not stiva:&lt;br /&gt;
                            break&lt;br /&gt;
                        b = stiva.pop()&lt;br /&gt;
                        if b != -1:&lt;br /&gt;
                            stiva.append(a + b)&lt;br /&gt;
                        else:&lt;br /&gt;
                            minus = False&lt;br /&gt;
                            break&lt;br /&gt;
                    stiva.append(a &amp;gt;&amp;gt; 1)&lt;br /&gt;
                    nr1 -= 1&lt;br /&gt;
                    nr2 -= 1&lt;br /&gt;
                    if nr2 &amp;gt; nr1:&lt;br /&gt;
                        ok = False&lt;br /&gt;
                else:&lt;br /&gt;
                    ok = False&lt;br /&gt;
&lt;br /&gt;
    if nr1 or nr2 or not e:&lt;br /&gt;
        ok = False&lt;br /&gt;
&lt;br /&gt;
    while stiva and ok:&lt;br /&gt;
        if stiva[-1] != -1:&lt;br /&gt;
            sum += stiva.pop()&lt;br /&gt;
        else:&lt;br /&gt;
            ok = False&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
    with open(output_file, &#039;w&#039;) as f:&lt;br /&gt;
        if ok:&lt;br /&gt;
            f.write(str(sum))&lt;br /&gt;
        else:&lt;br /&gt;
            f.write(&amp;quot;expresie gresita&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    input_file = &#039;expresie10IN.txt&#039;&lt;br /&gt;
    output_file = &#039;expresie10OUT.txt&#039;&lt;br /&gt;
    proceseaza_expresie(input_file, output_file)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0698_-_nrpits&amp;diff=9676</id>
		<title>0698 - nrpits</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0698_-_nrpits&amp;diff=9676"/>
		<updated>2024-02-23T20:01:18Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Se dă un șir de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere distincte &amp;lt;code&amp;gt;a[1],a[2],..a[N]&amp;lt;/code&amp;gt;. Orice secvență &amp;lt;code&amp;gt;a[i],a[i+1],...,a[j-1],a[j]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ i + 1 &amp;lt; j ≤ n&amp;lt;/code&amp;gt;, pentru care toate valorile &amp;lt;code&amp;gt;a[k]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;i &amp;lt; k &amp;lt; j&amp;lt;/code&amp;gt;, sunt mai mici decât extremitățile &amp;lt;code&amp;gt;a[i]&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;a[j]&amp;lt;/code&amp;gt;, o vom numi în continuare “groapă”.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieţi un program care va determina numărul “gropilor” din șirul dat.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;nrpitsIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numărul natural N. Pe linia a doua se află scrise cele N numere naturale ale șirului, separate prin spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;nrpitsOUT.txt&amp;lt;/code&amp;gt; va conține un singur număr reprezentând numărul de “gropi” ale șirului dat. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ N ≤ 1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ a[i] ≤ 1.000.000&amp;lt;/code&amp;gt;, pentru fiecare &amp;lt;code&amp;gt;1 ≤ i ≤ N&amp;lt;/code&amp;gt;&lt;br /&gt;
* orice “groapă” are cel puțin trei elemente&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;nrpitsIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 12&lt;br /&gt;
 12 1 10 3 4 11 5 8 7 9 2 6&lt;br /&gt;
&amp;lt;code&amp;gt;nrpitsOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Cele opt “gropi” sunt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;12 1 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;10 3 4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;12 1 10 3 4 11&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;10 3 4 11&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;11 5 8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;8 7 9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;9 2 6&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;11 5 8 7 9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;nrpitsIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1000001&lt;br /&gt;
 12 1 10 3 4 11 5 8 7 9 2 6&lt;br /&gt;
&amp;lt;code&amp;gt;nrpitsOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restricții(n, v):&lt;br /&gt;
    # Verificăm dacă N respectă restricțiile&lt;br /&gt;
    if not (2 &amp;lt;= n &amp;lt;= 1_000_000):&lt;br /&gt;
        return False&lt;br /&gt;
    # Verificăm dacă fiecare element din v respectă restricțiile&lt;br /&gt;
    for val in v:&lt;br /&gt;
        if not (1 &amp;lt;= val &amp;lt;= 1_000_000):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;nrpitsIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
        v = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verificăm restricțiile&lt;br /&gt;
    if not verifica_restricții(n, v):&lt;br /&gt;
        with open(&amp;quot;nrpitsOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return  # Oprim execuția dacă datele nu respectă restricțiile&lt;br /&gt;
&lt;br /&gt;
    # Continuăm procesarea datelor deoarece acestea respectă restricțiile&lt;br /&gt;
    v = [0] + v&lt;br /&gt;
    st = [-1] * (n + 1)&lt;br /&gt;
    dr = [-1] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    s = []&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        while s and v[i] &amp;gt; v[s[-1]]:&lt;br /&gt;
            s.pop()&lt;br /&gt;
        if s:&lt;br /&gt;
            st[i] = s[-1]&lt;br /&gt;
        s.append(i)&lt;br /&gt;
&lt;br /&gt;
    d = []&lt;br /&gt;
    for i in range(n, 0, -1):&lt;br /&gt;
        while d and v[i] &amp;gt; v[d[-1]]:&lt;br /&gt;
            d.pop()&lt;br /&gt;
        if d:&lt;br /&gt;
            dr[i] = d[-1]&lt;br /&gt;
        d.append(i)&lt;br /&gt;
&lt;br /&gt;
    ans = sum(1 for i in range(1, n + 1) if st[i] != -1 and dr[i] != -1)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;nrpitsOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(ans))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1936_-_Catalin_si_codul_secret&amp;diff=9675</id>
		<title>1936 - Catalin si codul secret</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1936_-_Catalin_si_codul_secret&amp;diff=9675"/>
		<updated>2024-02-23T19:47:08Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerința ==&lt;br /&gt;
&lt;br /&gt;
În banca lui Cătălin există un seif special unde Moș Crăciun își ține ascunse cadourile pentru copiii cei cuminți. Fiind vorba de o persoană așa de importantă, codul seifului nu este unul ușor. Moșului îi este dat un cartonaș cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere pe care le parcurge, în ordine, de la al doilea la penultimul, şi verifică pentru fiecare număr dacă cei &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; vecini sunt ori divizori ori multipli ai acestuia. Dacă da, va șterge primul triplet care respectă această regulă (numărul şi vecinii săi), formându-se un nou cod pentru care se reia de la început aplicarea regulii, până când nu mai există pe cartonaș niciun număr care să respecte proprietatea de eliminat.&lt;br /&gt;
&lt;br /&gt;
La final se vor obține valorile corecte ale codului, care vor fi introduse în ordinea apariției lor sau, în cazul în care s-au șters toate numerele de pe cartonaș, atunci codul va fi mesajul preferat folosit de Moș Crăciun: &amp;lt;code&amp;gt;Merry Christmas&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Date fiind cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere de pe cartonaş, Moșul vă roagă să aflați codul de care are nevoie pentru a putea deschide seiful în seara de ajun.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;codsecretIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a doua linie se găsesc &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale &amp;lt;code&amp;gt;x[1] x[2] ... x[n]&amp;lt;/code&amp;gt;, separate prin câte un spațiu, reprezentând numerele aflate pe cartonaș.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;codsecretOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie codul pe care Moș Crăciun îl va folosi pentru a deschide seiful. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; x[i] ≤ 10.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;codsecretIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 9&lt;br /&gt;
 2 12 6 3 10 2 4 8 3&lt;br /&gt;
&amp;lt;code&amp;gt;codsecretOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 8 3&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Numărul &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt; are &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; vecini, care sunt divizori ai săi deci vom șterge tripletul &amp;lt;code&amp;gt;2 12 6&amp;lt;/code&amp;gt;. Noul cod obținut este &amp;lt;code&amp;gt;3 10 2 4 8 3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
În noul cod avem numărul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, care are ca vecini doi multipli de-ai săi, deci vom șterge tripletul &amp;lt;code&amp;gt;10 2 4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Noul cod obținut este &amp;lt;code&amp;gt;3 8 3&amp;lt;/code&amp;gt;, căruia nu îi putem face modificări, așa că îl afișăm.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;codsecretIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100001&lt;br /&gt;
 2 12 6 3 10 2 4 8 3&lt;br /&gt;
&amp;lt;code&amp;gt;codsecretOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def conditie(a, b, c):&lt;br /&gt;
    return (b % a == 0 or a % b == 0) and (b % c == 0 or c % b == 0)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, numere):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000) or any(x &amp;lt;= 0 or x &amp;gt; 10000000 for x in numere):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        sys.exit()  # Încheie executia programului&lt;br /&gt;
&lt;br /&gt;
def citire():&lt;br /&gt;
    global v, k&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    numere = list(map(int, input().split()))&lt;br /&gt;
    verifica_restrictii(n, numere)  # Verificăm restricțiile pentru datele de intrare&lt;br /&gt;
    v = []&lt;br /&gt;
    k = 0&lt;br /&gt;
    for x in numere:&lt;br /&gt;
        v.append(x)&lt;br /&gt;
        k += 1&lt;br /&gt;
        if k &amp;gt;= 3 and conditie(v[k - 3], v[k - 2], v[k - 1]):&lt;br /&gt;
            k -= 3&lt;br /&gt;
            v = v[:-3]&lt;br /&gt;
&lt;br /&gt;
def rezolva():&lt;br /&gt;
    if k &amp;lt;= 0:&lt;br /&gt;
        print(&amp;quot;Crăciun Fericit&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        for i in range(k):&lt;br /&gt;
            print(v[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    sys.stdin = open(&amp;quot;codsecretIN.txt&amp;quot;, &amp;quot;r&amp;quot;, encoding=&#039;utf-8&#039;)&lt;br /&gt;
    sys.stdout = open(&amp;quot;codsecretOUT.txt&amp;quot;, &amp;quot;w&amp;quot;, encoding=&#039;utf-8&#039;)&lt;br /&gt;
    citire()&lt;br /&gt;
    rezolva()&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2068_-_kpal&amp;diff=9674</id>
		<title>2068 - kpal</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2068_-_kpal&amp;diff=9674"/>
		<updated>2024-02-23T11:31:38Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Alecu este un copil năzdrăvan care strică orice lucru. El a scris pe o foaie de hârtie un cuvânt. Fiind elev în clasa întâi, el nu a învățat decât primele &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; litere mici ale alfabetului englez, iar cuvântul de pe foaie este scris doar cu aceste litere.&lt;br /&gt;
&lt;br /&gt;
El își propune să taie foaia în mai multe bucăți dar să obțină doar cuvinte având același număr de litere și în același timp toate cuvintele obținute în urma tăierii să fie palindromuri. Un cuvânt este palindrom dacă citit de la stânga spre dreapta este identic cu cuvântul obținut prin citire de la dreapta spre stânga. Exemplu de palindrom este cuvântul &amp;lt;code&amp;gt;abcba&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
În dorința de a obține în urma tăierii doar cuvinte palindrom, Alecu poate schimba orice literă a cuvântului, în oricare alta cunoscută de el, dar fiecare astfel de schimbare are un cost cunoscut. Mai mult, el știe că o literă din cuvântul inițial nu o poate schimba decât cel mult o singură dată.&lt;br /&gt;
&lt;br /&gt;
Notăm cu &amp;lt;code&amp;gt;Nr(c)&amp;lt;/code&amp;gt; numărul minim de palindromuri de lungimi egale în care poate fi tăiat cuvântul de pe foaie, având voie să se efectueze schimbări ale literelor, dar care să nu însumeze un cost total mai mare decât &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Alecu știe să determine valoarea &amp;lt;code&amp;gt;Nr(c)&amp;lt;/code&amp;gt; pentru orice număr natural &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieți un program care pentru un număr natural &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; și șirul numerelor naturale &amp;lt;code&amp;gt;0,1,2,...,Q-1,Q&amp;lt;/code&amp;gt;, determină suma: &amp;lt;code&amp;gt;Nr(0)+Nr(1)+Nr(2)+...+ Nr(Q-1)+Nr(Q)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;kpalIN.txt&amp;lt;/code&amp;gt; pe prima linie conține numărul natural &amp;lt;code&amp;gt;X2. Următoarele&amp;lt;/code&amp;gt; X@ linii conțin câte &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; numere. Pentru toate aceste linii, al &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;-lea număr de pe linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; reprezintă costul de a transforma a &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-a literă în a &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;-a literă a alfabetului englez (&amp;lt;code&amp;gt;cost[i][j]&amp;lt;/code&amp;gt;). Pe linia &amp;lt;code&amp;gt;X+2&amp;lt;/code&amp;gt; se găsește un șir de litere ale alfabetului englez, reprezentând cuvântul scris inițial pe foaie. Ultima linie a fișierului conține numărul natural &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;kpalOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie un număr natural reprezentând suma determinată. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ lungimea cuvântului  ≤ 100 000&amp;lt;/code&amp;gt;, iar cuvântul conține doar litere mici;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ X ≤ 26&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ Q ≤ 1 000 000 000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ cost[i][j] ≤ 10000&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;1 ≤ i&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;j ≤ X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;i ≠ j&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;cost[i][i]=0&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;1 ≤ i ≤ X&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Dacă cuvântul inițial este palindrom, atunci considerăm că a fost obținut tot în urma unei tăieturi;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;kpalIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 0 1 2 &lt;br /&gt;
 3 0 2&lt;br /&gt;
 3 8 0 &lt;br /&gt;
 aabbbc&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;code&amp;gt;kpalOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 16&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;kpalIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 27&lt;br /&gt;
 0 1 2 &lt;br /&gt;
 3 0 2&lt;br /&gt;
 3 8 0 &lt;br /&gt;
 aabbbc&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;code&amp;gt;kpalOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(Sigma, Q, Cost):&lt;br /&gt;
    # Restrictiile impuse&lt;br /&gt;
    if not (1 &amp;lt;= Sigma &amp;lt;= 26 and 0 &amp;lt;= Q &amp;lt;= 1000000000):&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(Sigma):&lt;br /&gt;
        for j in range(Sigma):&lt;br /&gt;
            if i != j and not (1 &amp;lt;= Cost[i][j] &amp;lt;= 10000):&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;kpalIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        Sigma = int(f.readline().strip())&lt;br /&gt;
        if Sigma &amp;gt; 26:  # Verificare pentru Sigma&lt;br /&gt;
            with open(&amp;quot;kpalOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as out_file:&lt;br /&gt;
                out_file.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        Cost = [list(map(int, f.readline().split())) for _ in range(Sigma)]&lt;br /&gt;
        cuvant = f.readline().strip()&lt;br /&gt;
        Q = int(f.readline().strip())&lt;br /&gt;
&lt;br /&gt;
    if not verifica_restrictii(Sigma, Q, Cost):&lt;br /&gt;
        with open(&amp;quot;kpalOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    INF = 1000000000&lt;br /&gt;
    CostMatch = [[0] * 30 for _ in range(30)]&lt;br /&gt;
    Price = [0] * 300&lt;br /&gt;
    Count = [0] * 300&lt;br /&gt;
&lt;br /&gt;
    for i in range(Sigma):&lt;br /&gt;
        for j in range(Sigma):&lt;br /&gt;
            CostMatch[i][j] = INF&lt;br /&gt;
            for k in range(Sigma):&lt;br /&gt;
                CostMatch[i][j] = min(CostMatch[i][j], Cost[i][k] + Cost[j][k])&lt;br /&gt;
&lt;br /&gt;
    N = len(cuvant)&lt;br /&gt;
    StackSize = 0&lt;br /&gt;
&lt;br /&gt;
    for lung in range(1, N + 1):&lt;br /&gt;
        if N % lung != 0:&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        current_price = 0&lt;br /&gt;
        for i in range(N // lung):&lt;br /&gt;
            left = i * lung&lt;br /&gt;
            right = left + lung - 1&lt;br /&gt;
            while left &amp;lt; right:&lt;br /&gt;
                current_price += CostMatch[ord(cuvant[left]) - ord(&#039;a&#039;)][ord(cuvant[right]) - ord(&#039;a&#039;)]&lt;br /&gt;
                right -= 1&lt;br /&gt;
                left += 1&lt;br /&gt;
&lt;br /&gt;
        while StackSize &amp;gt; 0 and Price[StackSize - 1] &amp;gt;= current_price:&lt;br /&gt;
            StackSize -= 1&lt;br /&gt;
        Count[StackSize] = N // lung&lt;br /&gt;
        Price[StackSize] = current_price&lt;br /&gt;
        StackSize += 1&lt;br /&gt;
&lt;br /&gt;
    while StackSize &amp;gt; 0 and Price[StackSize - 1] &amp;gt; Q:&lt;br /&gt;
        StackSize -= 1&lt;br /&gt;
    Price[StackSize] = Q + 1&lt;br /&gt;
&lt;br /&gt;
    answer = 0&lt;br /&gt;
    for i in range(StackSize):&lt;br /&gt;
        answer += (Price[i + 1] - Price[i]) * Count[i]&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;kpalOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(str(answer) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2123_-_Relatii&amp;diff=9673</id>
		<title>2123 - Relatii</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2123_-_Relatii&amp;diff=9673"/>
		<updated>2024-02-23T11:23:09Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt == &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ar1&amp;lt;var2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
unde &amp;lt;code&amp;gt;var1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;var2&amp;lt;/code&amp;gt; sunt două nume de variabile (deci litere mici distincte dintre primele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; litere ale alfabetului englez).&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieţi un program care să ordoneze crescător cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; variabile pe baza celor &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; relaţii cunoscute.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;relatiiIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele naturale &amp;lt;code&amp;gt;N, M,&amp;lt;/code&amp;gt; separate prin spaţiu. Pe fiecare dintre următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii este scrisă o relaţie sub forma din enunţ.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;relatiiOUT.txt&amp;lt;/code&amp;gt; va conţine o singură linie pe care vor fi scrise &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; litere mici, neseparate prin spaţii, reprezentând variabilele ordonate crescător. Dacă există mai multe soluţii posibile, se va afişa cea mai mică din punct de vedere lexicografic (prima în dicţionar). În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
• &amp;lt;code&amp;gt;2 ≤ N ≤ 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
• &amp;lt;code&amp;gt;1 ≤ M ≤ 200&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
• Relaţiile specificate în fişierul de intrare nu conţin spaţii.&lt;br /&gt;
&lt;br /&gt;
• Pentru datele de test există întotdeauna soluţie, nu neapărat unică.&lt;br /&gt;
&lt;br /&gt;
• Spunem că sirul &amp;lt;code&amp;gt;x1x2...xN&amp;lt;/code&amp;gt; este mai mic din punct de vedere lexicografic decât şirul &amp;lt;code&amp;gt;y1y2...yN&amp;lt;/code&amp;gt; dacă există un indice &amp;lt;code&amp;gt;k (1≤k≤N)&amp;lt;/code&amp;gt; astfel încât &amp;lt;code&amp;gt;xi=yi&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;1≤i&amp;lt;k&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;xk&amp;lt;yk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;relatiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 5&lt;br /&gt;
 a&amp;lt;d&lt;br /&gt;
 a&amp;lt;c&lt;br /&gt;
 c&amp;gt;d&lt;br /&gt;
 b&amp;gt;c&lt;br /&gt;
 b&amp;gt;a&lt;br /&gt;
&amp;lt;code&amp;gt;relatiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 adcb&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;relatiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 5&lt;br /&gt;
 a&amp;lt;d&lt;br /&gt;
 a&amp;lt;c&lt;br /&gt;
 c&amp;gt;d&lt;br /&gt;
 b&amp;gt;c&lt;br /&gt;
 b&amp;gt;a&lt;br /&gt;
&amp;lt;code&amp;gt;relatiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verificare_restrictii(N, M):&lt;br /&gt;
    if not (2 &amp;lt;= N &amp;lt;= 10 and 1 &amp;lt;= M &amp;lt;= 200):&lt;br /&gt;
        with open(&amp;quot;relatiiOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse.\n&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def citire():&lt;br /&gt;
    with open(&amp;quot;relatiiIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        first_line = file.readline().strip()&lt;br /&gt;
        if not first_line:&lt;br /&gt;
            return None, None&lt;br /&gt;
        N, M = map(int, first_line.split())&lt;br /&gt;
        if not verificare_restrictii(N, M):&lt;br /&gt;
            return None, None&lt;br /&gt;
        R = [[0] * (N + 1) for _ in range(N + 1)]&lt;br /&gt;
        for _ in range(M):&lt;br /&gt;
            line = file.readline().strip()&lt;br /&gt;
            if not line:&lt;br /&gt;
               return None, None&lt;br /&gt;
            c1, c2, c3 = line[0], line[1], line[2]&lt;br /&gt;
            if c2 == &#039;&amp;lt;&#039;:&lt;br /&gt;
                R[ord(c1) - ord(&#039;a&#039;) + 1][ord(c3) - ord(&#039;a&#039;) + 1] = -1&lt;br /&gt;
                R[ord(c3) - ord(&#039;a&#039;) + 1][ord(c1) - ord(&#039;a&#039;) + 1] = 1&lt;br /&gt;
            else:&lt;br /&gt;
                R[ord(c1) - ord(&#039;a&#039;) + 1][ord(c3) - ord(&#039;a&#039;) + 1] = 1&lt;br /&gt;
                R[ord(c3) - ord(&#039;a&#039;) + 1][ord(c1) - ord(&#039;a&#039;) + 1] = -1&lt;br /&gt;
    return N, R&lt;br /&gt;
&lt;br /&gt;
def afisare(p):&lt;br /&gt;
    with open(&amp;quot;relatiiOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for i in range(1, len(p)):&lt;br /&gt;
            fout.write(chr(p[i] - 1 + ord(&#039;a&#039;)))&lt;br /&gt;
        fout.write(&#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
def verif(p, R):&lt;br /&gt;
    for i in range(1, len(p)):&lt;br /&gt;
        for j in range(i + 1, len(p)):&lt;br /&gt;
            if R[p[i]][p[j]] == 1:&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    N, R = citire()&lt;br /&gt;
    if N is None or R is None:&lt;br /&gt;
        return &lt;br /&gt;
    p = list(range(N + 1))&lt;br /&gt;
    while True:&lt;br /&gt;
        if verif(p, R):&lt;br /&gt;
            break&lt;br /&gt;
        j = N - 1&lt;br /&gt;
        while p[j] &amp;gt; p[j + 1]:&lt;br /&gt;
            j -= 1&lt;br /&gt;
        i = N&lt;br /&gt;
        while p[i] &amp;lt; p[j]:&lt;br /&gt;
            i -= 1&lt;br /&gt;
        p[i], p[j] = p[j], p[i]&lt;br /&gt;
        st, dr = j + 1, N&lt;br /&gt;
        while st &amp;lt; dr:&lt;br /&gt;
            p[st], p[dr] = p[dr], p[st]&lt;br /&gt;
            st += 1&lt;br /&gt;
            dr -= 1&lt;br /&gt;
    afisare(p)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1966_-_match&amp;diff=9672</id>
		<title>1966 - match</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1966_-_match&amp;diff=9672"/>
		<updated>2024-02-23T10:06:18Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Tanărul Pagnad proaspăt ajuns la facultate, vrea să prindă și el ceva. Fiind nemulțumit de celebra aplicație Tinder acesta dorește să-și creeze propria lui aplicație. Aplicația se folosește de datele strânse de pe diferite rețele de socializare ale utilizatorului și le codează într-o matrice. Stați calmi, nu trebuie sa creați voi matricea, dar pentru a-și studia compatibilitatea cu o persoana Pagnad se folosește de următoarele noțiuni.&lt;br /&gt;
&lt;br /&gt;
Acesta definește o structură de dimensiune &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; o submatrice pătratică de latura &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Compatibilitatea se stabilește în funcție de câte perechi de două structuri, nu neapărat de aceleași dimensiuni, dar de sumă egală se găsesc în două matrici (prima structură trebuie să aparțină primei matrici, a doua celei de-a doua matrici).&lt;br /&gt;
&lt;br /&gt;
Definim o structură prin coordonatele colțului stânga sus &amp;lt;code&amp;gt;(x,y)&amp;lt;/code&amp;gt; și dimensiunea laturii acesteia &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Două perechi &amp;lt;code&amp;gt;x1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;k1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;x2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;k2&amp;lt;/code&amp;gt; sunt diferite daca: &amp;lt;code&amp;gt;x1≠x2&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;k1≠k2&amp;lt;/code&amp;gt; sau daca &amp;lt;code&amp;gt;x1=x2&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;k1=k2&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;y1≠y2&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;x1=x2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y1=y2&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;k1≠k2&amp;lt;/code&amp;gt; (acestea fac referință pentru submatrice din aceeași matrice).&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se cere să se afle compatibilitatea între cele două matrice.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;matchIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n1&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;m1&amp;lt;/code&amp;gt;. Pe a doua linie se vor găsi &amp;lt;code&amp;gt;n1&amp;lt;/code&amp;gt; numere. Pe următoarea linie &amp;lt;code&amp;gt;n2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m2&amp;lt;/code&amp;gt;, iar pe linia a patra cele &amp;lt;code&amp;gt;n2&amp;lt;/code&amp;gt; numere.&lt;br /&gt;
&lt;br /&gt;
Unde &amp;lt;code&amp;gt;m1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m2&amp;lt;/code&amp;gt; reprezintă numărul de coloane, iar &amp;lt;code&amp;gt;n1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n2&amp;lt;/code&amp;gt; reprezintă dimensiunea totala a matricei.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;matchOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie un singur număr, respectiv compatibilitatea dintre cele două matrice. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;n1,n2 ≤ 31.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* numerele din matrice &amp;lt;code&amp;gt;&amp;lt;109&amp;lt;/code&amp;gt;&lt;br /&gt;
* se garantează că suma acestora este &amp;lt;code&amp;gt;&amp;lt;1018&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;m1≤n1&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;m2≤n2&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;(n1,m1)≠1&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;(n1,m2)≠1&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;(a,b)=cmmdc(a,b)&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;matchIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 9 3&lt;br /&gt;
 1 2 3 4 5 6 7 8 9&lt;br /&gt;
 9 3&lt;br /&gt;
 1 2 3 4 5 6 7 8 9&lt;br /&gt;
&amp;lt;code&amp;gt;matchOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 14&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Matricile sunt identice, deci se consideră toate submatricele primei matrice.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;matchIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 9 3&lt;br /&gt;
 1 2 3 4 5 6 7 8 9&lt;br /&gt;
 9 3&lt;br /&gt;
 1 2 3 4 5 6 7 8 9&lt;br /&gt;
&amp;lt;code&amp;gt;matchOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def check_restrictions(n1, m1, n2, m2):&lt;br /&gt;
    if n1 &amp;gt; 31000 or n2 &amp;gt; 31000 or m1 &amp;gt; n1 or m2 &amp;gt; n2:&lt;br /&gt;
        return False&lt;br /&gt;
    if (n1, m1) == (1, 1) or (n1, m2) == (1, 1):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def load_data(filename):&lt;br /&gt;
    global n1, n2, m1, m2, N1, N2, a, b&lt;br /&gt;
&lt;br /&gt;
    with open(filename, &#039;r&#039;) as fin:&lt;br /&gt;
        N1, m1 = map(int, fin.readline().split())&lt;br /&gt;
        n1 = N1 // m1&lt;br /&gt;
        if not check_restrictions(n1, m1, n1, m1):&lt;br /&gt;
            return False&lt;br /&gt;
        a = [[0 for _ in range(m1)] for _ in range(n1)]&lt;br /&gt;
        for i in range(n1):&lt;br /&gt;
            a[i] = list(map(int, fin.readline().split()))&lt;br /&gt;
        &lt;br /&gt;
        N2, m2 = map(int, fin.readline().split())&lt;br /&gt;
        n2 = N2 // m2&lt;br /&gt;
        if not check_restrictions(n2, m2, n2, m2):&lt;br /&gt;
            return False&lt;br /&gt;
        b = [[0 for _ in range(m2)] for _ in range(n2)]&lt;br /&gt;
        for i in range(n2):&lt;br /&gt;
            b[i] = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
MOD = 666013&lt;br /&gt;
NMAX = 175&lt;br /&gt;
&lt;br /&gt;
a = [[0 for _ in range(NMAX)] for _ in range(NMAX)]&lt;br /&gt;
b = [[0 for _ in range(NMAX)] for _ in range(NMAX)]&lt;br /&gt;
pd = [[0 for _ in range(NMAX)] for _ in range(NMAX)]&lt;br /&gt;
dp = [[0 for _ in range(NMAX)] for _ in range(NMAX)]&lt;br /&gt;
v = {i: [] for i in range(MOD + 1)}&lt;br /&gt;
&lt;br /&gt;
def fasuma():&lt;br /&gt;
    global dp, pd, a, b&lt;br /&gt;
    # Ajustarea indexării pentru Python, începând de la 0&lt;br /&gt;
    for i in range(1, n1 + 1):&lt;br /&gt;
        for j in range(1, m1 + 1):&lt;br /&gt;
            dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + a[i-1][j-1]&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n2 + 1):&lt;br /&gt;
        for j in range(1, m2 + 1):&lt;br /&gt;
            pd[i][j] = pd[i-1][j] + pd[i][j-1] - pd[i-1][j-1] + b[i-1][j-1]&lt;br /&gt;
&lt;br /&gt;
def pp(s, x):&lt;br /&gt;
    return {&#039;s&#039;: s, &#039;x&#039;: x}&lt;br /&gt;
&lt;br /&gt;
def bagahash(x):&lt;br /&gt;
    r = x % MOD&lt;br /&gt;
    for element in v[r]:&lt;br /&gt;
        if element[&#039;s&#039;] == x:&lt;br /&gt;
            element[&#039;x&#039;] += 1&lt;br /&gt;
            return&lt;br /&gt;
    v[r].append(pp(x, 1))&lt;br /&gt;
&lt;br /&gt;
def cauta(x):&lt;br /&gt;
    r = x % MOD&lt;br /&gt;
    for element in v[r]:&lt;br /&gt;
        if element[&#039;s&#039;] == x:&lt;br /&gt;
            return element[&#039;x&#039;]&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    if not load_data(&#039;matchIN.txt&#039;):&lt;br /&gt;
        with open(&#039;matchOUT.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    fasuma()&lt;br /&gt;
&lt;br /&gt;
    sol = 0&lt;br /&gt;
    # Calcularea și compararea sumelor submatricilor&lt;br /&gt;
    for k in range(1, min(n1, m1) + 1):&lt;br /&gt;
        for i in range(k, n1 + 1):&lt;br /&gt;
            for j in range(k, m1 + 1):&lt;br /&gt;
                s = dp[i][j] - dp[i-k][j] - dp[i][j-k] + dp[i-k][j-k]&lt;br /&gt;
                bagahash(s)&lt;br /&gt;
    for k in range(1, min(n2, m2) + 1):&lt;br /&gt;
        for i in range(k, n2 + 1):&lt;br /&gt;
            for j in range(k, m2 + 1):&lt;br /&gt;
                s = pd[i][j] - pd[i-k][j] - pd[i][j-k] + pd[i-k][j-k]&lt;br /&gt;
                sol += cauta(s)&lt;br /&gt;
    &lt;br /&gt;
    with open(&#039;matchOUT.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        fout.write(f&#039;{sol}\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1056_-_Unific&amp;diff=9671</id>
		<title>1056 - Unific</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1056_-_Unific&amp;diff=9671"/>
		<updated>2024-02-23T07:48:43Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt == &lt;br /&gt;
&lt;br /&gt;
Se consideră un şir &amp;lt;code&amp;gt;A=(A1, A2, ..., AN)&amp;lt;/code&amp;gt;, format din &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale nenule. Două numere se consideră vecine dacă se află pe poziţii alăturate (&amp;lt;code&amp;gt;Ai&amp;lt;/code&amp;gt; are ca vecini pe &amp;lt;code&amp;gt;Ai-1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;Ai+1&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;1&amp;lt;i&amp;lt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;A1&amp;lt;/code&amp;gt; are ca vecin doar pe &amp;lt;code&amp;gt;A2&amp;lt;/code&amp;gt;, iar &amp;lt;code&amp;gt;AN&amp;lt;/code&amp;gt; are ca vecin doar pe &amp;lt;code&amp;gt;AN-1&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Dacă două elemente vecine &amp;lt;code&amp;gt;Ai&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Ai+1&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1≤i&amp;lt;N&amp;lt;/code&amp;gt;) au cel puţin o cifră comună, ele se pot unifica. Procedeul de unificare constă în eliminarea din numerele &amp;lt;code&amp;gt;Ai&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;Ai+1&amp;lt;/code&amp;gt; a tuturor cifrelor comune şi adăugarea prin alipirea numărului obţinut din &amp;lt;code&amp;gt;Ai+1&amp;lt;/code&amp;gt; la numărul obţinut din &amp;lt;code&amp;gt;Ai&amp;lt;/code&amp;gt;, formându-se astfel un nou număr. Numărul &amp;lt;code&amp;gt;Ai&amp;lt;/code&amp;gt; va fi înlocuit cu noul număr, iar numărul &amp;lt;code&amp;gt;Ai+1&amp;lt;/code&amp;gt; va fi eliminat din şir.&lt;br /&gt;
&lt;br /&gt;
De exemplu, numerele &amp;lt;code&amp;gt;Ai=23814&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;Ai+1=40273&amp;lt;/code&amp;gt; au cifrele &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; comune, după unificare obţinem &amp;lt;code&amp;gt;Ai=817&amp;lt;/code&amp;gt;, iar &amp;lt;code&amp;gt;Ai+1&amp;lt;/code&amp;gt; este eliminat; observaţi că dacă după eliminarea cifrelor comune, numerele încep cu zerouri nesemnificative, acestea vor fi eliminate, apoi se realizează alipirea.&lt;br /&gt;
&lt;br /&gt;
Dacă în urma eliminării cifrelor comune, unul dintre numere nu mai are cifre, atunci numărul rezultat va avea cifrele rămase în celălalt. Dacă în urma eliminării cifrelor comune atât &amp;lt;code&amp;gt;Ai&amp;lt;/code&amp;gt; cât şi &amp;lt;code&amp;gt;Ai+1&amp;lt;/code&amp;gt; nu mai au cifre, atunci ambele numere vor fi eliminate din şir, fără a fi înlocuite cu o altă valoare.&lt;br /&gt;
&lt;br /&gt;
Ordinea în care se fac unificările în şir este importantă: la fiecare pas se alege prima pereche de elemente vecine &amp;lt;code&amp;gt;Ai&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;Ai+1&amp;lt;/code&amp;gt; care poate fi unificată, considerând şirul parcurs de la stânga la dreapta. (De exemplu, considerând &amp;lt;code&amp;gt;Ai=123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Ai+1=234&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Ai+2=235&amp;lt;/code&amp;gt;, se unifică &amp;lt;code&amp;gt;Ai&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;Ai+1&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;Ai=14&amp;lt;/code&amp;gt;, iar unificarea cu următorul număr nu mai este posibilă).&lt;br /&gt;
&lt;br /&gt;
= Cerinţă =&lt;br /&gt;
Cunoscându-se şirul celor &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale, să se determine:&lt;br /&gt;
&lt;br /&gt;
a) cifra care apare cel mai frecvent în scrierea tuturor celor &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere; dacă există mai multe cifre cu aceeaşi frecvenţă de apariţie maximă, se va reţine cea mai mică cifră.&lt;br /&gt;
&lt;br /&gt;
b) şirul obţinut prin efectuarea unui număr maxim de unificări, după regulile descrise în enunţ.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;unificIN.txt&amp;lt;/code&amp;gt; conține pe prima linie o valoare naturală &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii, în ordine, cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale din şirul &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;, câte un număr pe o linie.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;unificOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie un număr natural c reprezentând cifra care apare cel mai frecvent în scrierea celor &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale. Pe cea de a doua linie un număr natural &amp;lt;code&amp;gt;Nr&amp;lt;/code&amp;gt; reprezentând numărul de numere naturale rămase în şir după efectuarea unui număr maxim de unificări. Pe cea de a treia linie se vor scrie cele &amp;lt;code&amp;gt;Nr&amp;lt;/code&amp;gt; numere naturale rămase, în ordinea din şir, separate prin câte un spaţiu.&lt;br /&gt;
&lt;br /&gt;
Dacă în urma procedeului de unificare, toate numerele vor fi eliminate, fişierul de ieşire va conţine o singură linie, pe care se va scrie cifra care apare cel mai frecvent în scrierea celor &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 100 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Numerele din şirul iniţial, precum şi numerele obţinute în urma unificărilor, nu vor depăşi &amp;lt;code&amp;gt;1018&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru datele de test şirul obţinut în urma unificărilor este nevid.&lt;br /&gt;
* Pentru 30% dintre teste &amp;lt;code&amp;gt;N ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 70% dintre teste numere naturale din şir au cifrele nenule.&lt;br /&gt;
* Pentru determinarea corectă a primei cerinţe se acordă 10% din punctajul pe test. Punctajul integral se acordă pe ambele cerinţe rezolvate corect.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;unificIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 10&lt;br /&gt;
 6&lt;br /&gt;
 47&lt;br /&gt;
 67&lt;br /&gt;
 40&lt;br /&gt;
 123&lt;br /&gt;
 231&lt;br /&gt;
 1238&lt;br /&gt;
 331&lt;br /&gt;
 2035&lt;br /&gt;
 50007&lt;br /&gt;
&amp;lt;code&amp;gt;unificOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 2&lt;br /&gt;
 0 837&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Cifra care apare cel mai frecvent este &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; (de &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; ori).&lt;br /&gt;
&lt;br /&gt;
Se unifică: &amp;lt;code&amp;gt;47&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;67  =&amp;gt; 46&amp;lt;/code&amp;gt;. Şirul rămas: &amp;lt;code&amp;gt;6 46 40 123 231 1238 331 2035 50007&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se unifică: &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;46  =&amp;gt; 4&amp;lt;/code&amp;gt;. Şirul rămas: &amp;lt;code&amp;gt;4 40 123 231 1238 331 2035 50007&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se unifică: &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;40 =&amp;gt; 0&amp;lt;/code&amp;gt;. Şirul rămas: &amp;lt;code&amp;gt;0 123 231 1238 331 2035 50007&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se unifică: &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;231&amp;lt;/code&amp;gt;, ambele numere rămân fără cifre, deci vor fi ambele eliminate. Şirul rămas: &amp;lt;code&amp;gt;0 1238 331 2035 50007&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se unifică: &amp;lt;code&amp;gt;1238&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;331 =&amp;gt; 28&amp;lt;/code&amp;gt;. Şirul rămas: &amp;lt;code&amp;gt;0 28 2035 50007&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se unifică: &amp;lt;code&amp;gt;28&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;2035 =&amp;gt; 835&amp;lt;/code&amp;gt;. Şirul rămas: &amp;lt;code&amp;gt;0 835 50007&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se unifică: &amp;lt;code&amp;gt;835&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;50007 =&amp;gt; 837&amp;lt;/code&amp;gt;. Şirul rămas: &amp;lt;code&amp;gt;0 837&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: ==&lt;br /&gt;
&amp;lt;code&amp;gt;unificIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100001&lt;br /&gt;
 6&lt;br /&gt;
 47&lt;br /&gt;
 67&lt;br /&gt;
 40&lt;br /&gt;
 123&lt;br /&gt;
 231&lt;br /&gt;
 1238&lt;br /&gt;
 331&lt;br /&gt;
 2035&lt;br /&gt;
 50007&lt;br /&gt;
&amp;lt;code&amp;gt;unificOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, numere):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for numar in numere:&lt;br /&gt;
        if not (0 &amp;lt;= numar &amp;lt;= 10**18):&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;unificIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;unificOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        numere = []&lt;br /&gt;
&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            line = fin.readline().strip()&lt;br /&gt;
            if line:&lt;br /&gt;
                numere.append(int(line))&lt;br /&gt;
&lt;br /&gt;
        if not verifica_restrictii(n, numere):&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        frec = [0] * 11&lt;br /&gt;
        st = []&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        def cifre(x):&lt;br /&gt;
            while x:&lt;br /&gt;
                frec[x % 10] += 1&lt;br /&gt;
                x //= 10&lt;br /&gt;
&lt;br /&gt;
        def verif(poz):&lt;br /&gt;
            aux1 = [0] * 11&lt;br /&gt;
            x = st[poz - 1]&lt;br /&gt;
            if x == 0:&lt;br /&gt;
                aux1[0] += 1&lt;br /&gt;
&lt;br /&gt;
            while x:&lt;br /&gt;
                aux1[x % 10] += 1&lt;br /&gt;
                x //= 10&lt;br /&gt;
&lt;br /&gt;
            y = st[poz]&lt;br /&gt;
            if y == 0 and aux1[0] != 0:&lt;br /&gt;
                return 1&lt;br /&gt;
&lt;br /&gt;
            while y:&lt;br /&gt;
                if aux1[y % 10] != 0:&lt;br /&gt;
                    return 1&lt;br /&gt;
                y //= 10&lt;br /&gt;
            return 0&lt;br /&gt;
&lt;br /&gt;
        def getnum(dr):&lt;br /&gt;
            f = [0] * 21&lt;br /&gt;
            unu = [0] * 21&lt;br /&gt;
            doi = [0] * 21&lt;br /&gt;
            cif1, cif2 = 0, 0&lt;br /&gt;
            x, y = st[dr - 1], st[dr]&lt;br /&gt;
            st_num, drr = 0, 0&lt;br /&gt;
            concatenate = False&lt;br /&gt;
            ok = False&lt;br /&gt;
&lt;br /&gt;
            if x == 0:&lt;br /&gt;
                f[0] += 1&lt;br /&gt;
                unu[cif1] = 0&lt;br /&gt;
                cif1 += 1&lt;br /&gt;
            if y == 0:&lt;br /&gt;
                f[0] += 1&lt;br /&gt;
                doi[cif2] = 0&lt;br /&gt;
                cif2 += 1&lt;br /&gt;
            while x:&lt;br /&gt;
                cif1 += 1&lt;br /&gt;
                unu[cif1] = x % 10&lt;br /&gt;
                f[x % 10] += 1&lt;br /&gt;
                x //= 10&lt;br /&gt;
            while y:&lt;br /&gt;
                if f[y % 10] != 0:&lt;br /&gt;
                    f[y % 10] = -1&lt;br /&gt;
                cif2 += 1&lt;br /&gt;
                doi[cif2] = y % 10&lt;br /&gt;
                y //= 10&lt;br /&gt;
&lt;br /&gt;
            for i in range(cif1, 0, -1):&lt;br /&gt;
                if f[unu[i]] != -1:&lt;br /&gt;
                    st_num = 10 * st_num + unu[i]&lt;br /&gt;
                    ok = True&lt;br /&gt;
            for i in range(cif2, 0, -1):&lt;br /&gt;
                if f[doi[i]] != -1:&lt;br /&gt;
                    drr = 10 * drr + doi[i]&lt;br /&gt;
                    ok = True&lt;br /&gt;
                    concatenate = True&lt;br /&gt;
&lt;br /&gt;
            if not ok:&lt;br /&gt;
                return -1&lt;br /&gt;
&lt;br /&gt;
            if concatenate:&lt;br /&gt;
                p = 10&lt;br /&gt;
                while drr &amp;gt;= p:&lt;br /&gt;
                    p *= 10&lt;br /&gt;
                return st_num * p + drr&lt;br /&gt;
&lt;br /&gt;
            return st_num&lt;br /&gt;
&lt;br /&gt;
        for numar in numere:&lt;br /&gt;
            cifre(numar) &lt;br /&gt;
            st.append(numar)  &lt;br /&gt;
&lt;br /&gt;
            while len(st) &amp;gt;= 2 and verif(len(st) - 1):&lt;br /&gt;
                x = getnum(len(st) - 1)&lt;br /&gt;
                if x != -1:&lt;br /&gt;
                    st[-2] = x&lt;br /&gt;
                    st.pop()&lt;br /&gt;
                else:&lt;br /&gt;
                    st.pop()&lt;br /&gt;
                    st.pop()&lt;br /&gt;
&lt;br /&gt;
        maxi, afis = max((val, idx) for idx, val in enumerate(frec))&lt;br /&gt;
&lt;br /&gt;
        fout.write(f&#039;{afis}\n&#039;)&lt;br /&gt;
        fout.write(f&#039;{len(st)}\n&#039;)&lt;br /&gt;
        for numar in st:&lt;br /&gt;
            fout.write(f&#039;{numar} &#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1237_-_Numereiajb&amp;diff=9670</id>
		<title>1237 - Numereiajb</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1237_-_Numereiajb&amp;diff=9670"/>
		<updated>2024-02-23T07:20:01Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinta ==&lt;br /&gt;
&lt;br /&gt;
Numerele &amp;lt;code&amp;gt;iajb&amp;lt;/code&amp;gt; sunt numerele care pot fi scrise sub forma &amp;lt;code&amp;gt;i * a + j * b&amp;lt;/code&amp;gt;, cu &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; numere naturale și &amp;lt;code&amp;gt;i + j &amp;gt; 0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Cunoscând &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; și un număr &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, să se determine valorile &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; pentru care se vor forma primele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere &amp;lt;code&amp;gt;iajb&amp;lt;/code&amp;gt; in ordine crescătoare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;numereiajbIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; numere naturale &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, având semnificațiile de mai sus.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;numereiajbOUT.txt&amp;lt;/code&amp;gt; va conține pe cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii câte o pereche de numere naturale &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; care răspund cerinței. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 2.000.000&amp;lt;/code&amp;gt; (!)&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ a, b ≤ 50.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Dacă un număr &amp;lt;code&amp;gt;iajb&amp;lt;/code&amp;gt; se obține din perechi diferite de &amp;lt;code&amp;gt;(i, j)&amp;lt;/code&amp;gt; atunci se va afișa doar cea cu &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-ul minim&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;numereiajbIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 3 5&lt;br /&gt;
&amp;lt;code&amp;gt;numereiajbOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 0&lt;br /&gt;
 0 1&lt;br /&gt;
 2 0&lt;br /&gt;
 1 1&lt;br /&gt;
 0 2&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
&amp;lt;code&amp;gt;1 * 2 + 0 * 3 = 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0 * 2 + 1 * 3 = 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2 * 2 + 0 * 3 = 4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 * 2 + 1 * 3 = 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0 * 2 + 2 * 3 = 6&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;numereiajbIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 3 50001&lt;br /&gt;
&amp;lt;code&amp;gt;numereiajbOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verificare_restrictii(n, a, b):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 2000000 and 1 &amp;lt;= a &amp;lt;= 50000 and 1 &amp;lt;= b &amp;lt;= 50000):&lt;br /&gt;
        with open(&amp;quot;numereiajbOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    fin = open(&amp;quot;numereiajbIN.txt&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
    fout = open(&amp;quot;numereiajbOUT.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    n, a, b = map(int, fin.readline().split())&lt;br /&gt;
    if not verificare_restrictii(n, a, b):&lt;br /&gt;
        fin.close()&lt;br /&gt;
        fout.close()&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    Q = [[], []]&lt;br /&gt;
    Q[0].append((1, 0))&lt;br /&gt;
    Q[1].append((0, 1))&lt;br /&gt;
    last = -1&lt;br /&gt;
&lt;br /&gt;
    for t in range(1, n + 1):&lt;br /&gt;
        crt = [Q[j][0][0] * a + Q[j][0][1] * b for j in range(2)]&lt;br /&gt;
        if crt[0] &amp;lt; crt[1]:&lt;br /&gt;
            i, j = Q[0].pop(0)&lt;br /&gt;
            nr = crt[0]&lt;br /&gt;
        else:&lt;br /&gt;
            i, j = Q[1].pop(0)&lt;br /&gt;
            nr = crt[1]&lt;br /&gt;
        if nr == last:&lt;br /&gt;
            t -= 1&lt;br /&gt;
            continue&lt;br /&gt;
        last = nr&lt;br /&gt;
        fout.write(f&amp;quot;{i} {j}\n&amp;quot;)&lt;br /&gt;
        Q[0].append((i + 1, j))&lt;br /&gt;
        Q[1].append((i, j + 1))&lt;br /&gt;
&lt;br /&gt;
    fin.close()&lt;br /&gt;
    fout.close()&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1275_-_Jaina&amp;diff=9669</id>
		<title>1275 - Jaina</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1275_-_Jaina&amp;diff=9669"/>
		<updated>2024-02-23T07:07:58Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinta ==&lt;br /&gt;
&lt;br /&gt;
Jaina se află în Theramore Isle și trebuie să ajungă la mentorul ei, Antonidas. Aceștia se află într-o matrice pătratică de dimensiune &amp;lt;code&amp;gt;n x n&amp;lt;/code&amp;gt;, în poziții de coordonate cunoscute.&lt;br /&gt;
&lt;br /&gt;
Jaina se poate deplasa în oricare dintre cele &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; direcții. Astfel, dacă inițial ea se găsește în celula de coordonate &amp;lt;code&amp;gt;(x, y)&amp;lt;/code&amp;gt;, poate ajunge în oricare dintre celulele &amp;lt;code&amp;gt;(x-1, y-1)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(x-1, y)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(x-1, y + 1)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(x, y + 1)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(x + 1, y + 1)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(x + 1, y)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(x + 1, y - 1)&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;(x, y - 1)&amp;lt;/code&amp;gt; făcând exact un pas.&lt;br /&gt;
&lt;br /&gt;
În anumite celule se află câte o sursă de energie. Fiecare sursă emite raze în patru direcții &amp;lt;code&amp;gt;(N, E, S, V)&amp;lt;/code&amp;gt;, fiecare rază ajungând până la marginea matricei.&lt;br /&gt;
&lt;br /&gt;
Când Jaina pășește pe o astfel de rază, ea se teleportează obligatoriu în celula sursei razei respective, deci nu este posibilă trecerea dincolo de aceste raze decât prin punctul sursă. Teleportarea este automată și instantanee și nu se consideră ca fiind un pas al Jainei.&lt;br /&gt;
&lt;br /&gt;
Antonidas vă roagă să o ajutați pe Jaina să ajungă la el, efectuând un număr minim de pași!&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;jainaIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a doua linie &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; numere naturale separate prin spații, care semnifică coordonatele celulei în care se află Jaina și coordonatele celulei în care se află Antonidas. ( 2 perechi linie-coloană )&lt;br /&gt;
&lt;br /&gt;
A treia linie conține numărul &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; de surse de energie.&lt;br /&gt;
&lt;br /&gt;
Pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii se află câte două numere naturale &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt;, reprezentând coordonatele fiecărei surse.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;jainaOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;nrp&amp;lt;/code&amp;gt;, reprezentând numărul minim de pași pe care Jaina trebuie să-i efectueze pentru a ajunge la Antonidas. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m ≤ 10&amp;lt;/code&amp;gt;&lt;br /&gt;
* Orice celulă are dimensiunea &amp;lt;code&amp;gt;1x1&amp;lt;/code&amp;gt;&lt;br /&gt;
* În cazul în care Jaina se află la intersecția a două raze de surse diferite, aceasta se va teleporta la sursa de linie minimă.&lt;br /&gt;
* Nu există două surse care să se afle pe aceeași linie sau pe aceeași coloană.&lt;br /&gt;
* Se garantează că există soluție pentru toate testele.&lt;br /&gt;
* Antonidas promite că o să fiți răsplătiți cu o minge de foc dacă găsiți răspunsul corect la această problemă.&lt;br /&gt;
* Deoarece Jaina este disperată, limitele de memorie sunt foarte mari, însă pe viitor nu este garantat acest lucru!&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;jainaIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 2 1 4 4 &lt;br /&gt;
 1&lt;br /&gt;
 3 3&lt;br /&gt;
&amp;lt;code&amp;gt;jainaOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Numărul de pași necesari în acest caz este 2.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;jainaIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 2 1 4 4 &lt;br /&gt;
 1&lt;br /&gt;
 3 3&lt;br /&gt;
&amp;lt;code&amp;gt;jainaOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import deque&lt;br /&gt;
&lt;br /&gt;
class Celula:&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self.val = 0&lt;br /&gt;
        self.laser = 0&lt;br /&gt;
        self.xs = 0&lt;br /&gt;
        self.ys = 0&lt;br /&gt;
&lt;br /&gt;
nmax = 100&lt;br /&gt;
dl = [-1, -1, -1, 0, 1, 1, 1, 0]&lt;br /&gt;
dc = [-1, 0, 1, 1, 1, 0, -1, -1]&lt;br /&gt;
&lt;br /&gt;
def inside(x, y, n):&lt;br /&gt;
    return 1 &amp;lt;= x &amp;lt;= n and 1 &amp;lt;= y &amp;lt;= n&lt;br /&gt;
&lt;br /&gt;
def nord_sud(x, y, a, n):&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if a[i][y].laser == 0 and i != x:&lt;br /&gt;
            a[i][y].laser = 1&lt;br /&gt;
            a[i][y].xs = x&lt;br /&gt;
            a[i][y].ys = y&lt;br /&gt;
        elif i != x:&lt;br /&gt;
            if x &amp;lt; a[i][y].xs:&lt;br /&gt;
                a[i][y].xs = x&lt;br /&gt;
                a[i][y].ys = y&lt;br /&gt;
&lt;br /&gt;
def est_vest(x, y, a, n):&lt;br /&gt;
    for j in range(1, n + 1):&lt;br /&gt;
        if a[x][j].laser == 0 and j != y:&lt;br /&gt;
            a[x][j].laser = 1&lt;br /&gt;
            a[x][j].xs = x&lt;br /&gt;
            a[x][j].ys = y&lt;br /&gt;
        elif j != y:&lt;br /&gt;
            if x &amp;lt; a[x][j].xs:&lt;br /&gt;
                a[x][j].xs = x&lt;br /&gt;
                a[x][j].ys = y&lt;br /&gt;
&lt;br /&gt;
def solve(n, xi, yi, xf, yf, m, a):&lt;br /&gt;
    q = deque([(xi, yi)])&lt;br /&gt;
    a[xi][yi].val = 1&lt;br /&gt;
&lt;br /&gt;
    while q:&lt;br /&gt;
        f1, f2 = q.popleft()&lt;br /&gt;
&lt;br /&gt;
        for k in range(8):&lt;br /&gt;
            iv = f1 + dl[k]&lt;br /&gt;
            jv = f2 + dc[k]&lt;br /&gt;
&lt;br /&gt;
            if inside(iv, jv, n) and (not a[iv][jv].val or a[iv][jv].val &amp;gt; a[f1][f2].val + 1):&lt;br /&gt;
                if a[iv][jv].laser == 0:&lt;br /&gt;
                    a[iv][jv].val = a[f1][f2].val + 1&lt;br /&gt;
                    q.append((iv, jv))&lt;br /&gt;
                else:&lt;br /&gt;
                    lin = a[iv][jv].xs&lt;br /&gt;
                    col = a[iv][jv].ys&lt;br /&gt;
                    a[iv][jv].val = a[f1][f2].val + 1&lt;br /&gt;
&lt;br /&gt;
                    if a[lin][col].val &amp;gt; a[iv][jv].val or not a[lin][col].val:&lt;br /&gt;
                        a[lin][col].val = a[iv][jv].val&lt;br /&gt;
                        q.append((lin, col))&lt;br /&gt;
                        q.append((iv, jv))&lt;br /&gt;
&lt;br /&gt;
    return a[xf][yf].val - 1&lt;br /&gt;
&lt;br /&gt;
def verificare_restrictii(n, m):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100 and 1 &amp;lt;= m &amp;lt;= 10):&lt;br /&gt;
        with open(&amp;quot;jainaOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def citire():&lt;br /&gt;
    with open(&amp;quot;jainaIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
        xi, yi, xf, yf = map(int, f.readline().split())&lt;br /&gt;
        m = int(f.readline().strip())&lt;br /&gt;
        if not verificare_restrictii(n, m):&lt;br /&gt;
            exit()  # Ieșire din program dacă restricțiile nu sunt respectate&lt;br /&gt;
        a = [[Celula() for _ in range(nmax + 1)] for _ in range(nmax + 1)]&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            x, y = map(int, f.readline().split())&lt;br /&gt;
            nord_sud(x, y, a, n)&lt;br /&gt;
            est_vest(x, y, a, n)&lt;br /&gt;
    return n, xi, yi, xf, yf, a&lt;br /&gt;
&lt;br /&gt;
def scriere(result):&lt;br /&gt;
    with open(&amp;quot;jainaOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(str(result))&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, xi, yi, xf, yf, a = citire()&lt;br /&gt;
    result = solve(n, xi, yi, xf, yf, n, a)&lt;br /&gt;
    scriere(result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1337_-_Susan&amp;diff=9668</id>
		<title>1337 - Susan</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1337_-_Susan&amp;diff=9668"/>
		<updated>2024-02-23T07:00:31Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinta == &lt;br /&gt;
&lt;br /&gt;
Eroul nostru Susan se află într-un turn de formă cubică, de latură &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. El dorește să ajungă la comoara ascunsă în interiorul turnului. Din fericire, Susan a făcut rost de o hartă care îi indică cu exactitate coordonatele locului în care se află comoara din turn. Eroul nostru vrea să știe care este distanța minimă pe care o poate parcurge pentru a ajunge la comoară.&lt;br /&gt;
&lt;br /&gt;
Turnul este împărțit în &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; etaje, iar fiecare etaj este împărțit în &amp;lt;code&amp;gt;n x n&amp;lt;/code&amp;gt; celule (camere). O cameră poate:&lt;br /&gt;
&lt;br /&gt;
* fi blocată, astfel fiind inaccesibilă eroului nostru&lt;br /&gt;
* fi accesibilă, astfel eroul nostru poate intra în aceasta&lt;br /&gt;
* conține o scară ascendentă care îl poate duce pe erou cu un etaj mai sus, în camera situată deasupra camerei curente&lt;br /&gt;
* conține o scară descendentă care îl poate duce pe erou cu un etaj mai jos, în camera situată sub camera curentă&lt;br /&gt;
* conține o trapă prin care eroul va cădea la etajul inferior, în camerele situate sub camera curentă (dacă eroul, în urma căderii, se află într-o cameră ce conține o trapă, el va continua să cadă până se va afla într-o o cameră fără trapă, pe aceeași coloană)&lt;br /&gt;
&lt;br /&gt;
La fiecare trecere dintr-o cameră în alta, eroul execută un pas.&lt;br /&gt;
&lt;br /&gt;
Fiind date latura turnului și coordonatele zidurilor, scărilor, gropilor, eroului și a comorii, se cere să se afișeze numărul minim de pași pe care îl poate parcurge Susan pentru a ajunge la comoară.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;turnIN.txt&amp;lt;/code&amp;gt; conține:&lt;br /&gt;
&lt;br /&gt;
* pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, reprezentând lungimea laturii turnului.&lt;br /&gt;
* pe a doua linie se află numărul &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt;, reprezentând numărul de ziduri, numărul &amp;lt;code&amp;gt;s1&amp;lt;/code&amp;gt;, reprezentând numărul de scări descendente, numărul &amp;lt;code&amp;gt;s2&amp;lt;/code&amp;gt;, reprezentând numărul de scări descendente și numărul &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt;, reprezentând numărul de gropi.&lt;br /&gt;
* pe următoarele &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; linii se află coordonatele zidurilor.&lt;br /&gt;
* pe următoarele &amp;lt;code&amp;gt;s1&amp;lt;/code&amp;gt; linii se află coordonatele scărilor ascendente.&lt;br /&gt;
* pe următoarele &amp;lt;code&amp;gt;s2&amp;lt;/code&amp;gt; linii se află coordonatele scărilor descendente.&lt;br /&gt;
* pe următoarele &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; linii se află coordonatele gropilor.&lt;br /&gt;
* pe penultima linie se află coordonatele eroului, iar pe ultima linie se află coordonatele comorii.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;turnOUT.txt&amp;lt;/code&amp;gt; va conține numărul minim de pași pe care îl poate face Susan pentru a ajunge la comoara sa. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ z ≤ 30000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ s1 ≤ s2 ≤ 200&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ g ≤ 10000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Se garantează că există soluție pentru toate datele de test.&lt;br /&gt;
* Poziția inițială se consideră a fi situată la pasul 1.&lt;br /&gt;
* Trapa generează o cădere a eroului pe verticală, până când ajunge într-o cameră fără trapă.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;turnIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 9 3 3 3&lt;br /&gt;
 1 1 3&lt;br /&gt;
 1 2 1&lt;br /&gt;
 1 3 2&lt;br /&gt;
 2 1 1&lt;br /&gt;
 2 1 3&lt;br /&gt;
 2 2 2&lt;br /&gt;
 3 1 1&lt;br /&gt;
 3 2 3&lt;br /&gt;
 3 3 3&lt;br /&gt;
 1 2 3&lt;br /&gt;
 2 3 2&lt;br /&gt;
 2 1 2&lt;br /&gt;
 2 2 3&lt;br /&gt;
 3 3 2&lt;br /&gt;
 3 1 2&lt;br /&gt;
 3 3 1&lt;br /&gt;
 3 2 1&lt;br /&gt;
 2 3 1&lt;br /&gt;
 1 1 1&lt;br /&gt;
 2 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;turnOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 11&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Turnul are &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; etaje. Susan pleacă din celula de coordonate &amp;lt;code&amp;gt;(1 1 1)&amp;lt;/code&amp;gt;, iar celula în care se află comoara are coordonatele &amp;lt;code&amp;gt;(2 2 1)&amp;lt;/code&amp;gt;. Există &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; celule în care se află ziduri, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; celule în care se află scări ascendente, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; celule în care se află scări descendente și &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; celule în care se află gropi. Traseul cel mai scurt trece prin &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; camere: &amp;lt;code&amp;gt;(1 1 1) (1 1 2) (1 2 2) (1 2 3) (2 2 3) (2 3 3) (2 3 2) (3 3 2) (3 2 2) (3 2 1) (2 2 1)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;turnIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 9 3 3 3&lt;br /&gt;
 1 1 3&lt;br /&gt;
 1 2 1&lt;br /&gt;
 1 3 2&lt;br /&gt;
&amp;lt;code&amp;gt;turnOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import deque&lt;br /&gt;
&lt;br /&gt;
dy = [1, -1, 0, 0]&lt;br /&gt;
dz = [0, 0, 1, -1]&lt;br /&gt;
&lt;br /&gt;
def inmat(i, j, k, n):&lt;br /&gt;
    return 1 &amp;lt;= i &amp;lt;= n and 1 &amp;lt;= j &amp;lt;= n and 1 &amp;lt;= k &amp;lt;= n&lt;br /&gt;
&lt;br /&gt;
def lee(n, a, is_, js, ks, ifi, jfi, kfi):&lt;br /&gt;
    b = [[[0 for _ in range(n + 1)] for _ in range(n + 1)] for _ in range(n + 1)]&lt;br /&gt;
    q = deque([(is_, js, ks)])&lt;br /&gt;
    b[is_][js][ks] = 1&lt;br /&gt;
&lt;br /&gt;
    while q:&lt;br /&gt;
        x, y, w = q.popleft()&lt;br /&gt;
        if a[x][y][w] != 4:&lt;br /&gt;
            for d in range(4):&lt;br /&gt;
                ii = x&lt;br /&gt;
                jj = y + dy[d]&lt;br /&gt;
                kk = w + dz[d]&lt;br /&gt;
                if inmat(ii, jj, kk, n) and a[ii][jj][kk] != 1 and b[ii][jj][kk] == 0:&lt;br /&gt;
                    b[ii][jj][kk] = b[x][y][w] + 1&lt;br /&gt;
                    q.append((ii, jj, kk))&lt;br /&gt;
        if a[x][y][w] == 4:&lt;br /&gt;
            ii = x&lt;br /&gt;
            cnt = 0&lt;br /&gt;
            while a[ii][y][w] == 4:&lt;br /&gt;
                ii -= 1&lt;br /&gt;
                cnt += 1&lt;br /&gt;
            if inmat(ii, y, w, n) and a[ii][y][w] != 1 and b[ii][y][w] == 0:&lt;br /&gt;
                b[ii][y][w] = b[x][y][w] + cnt&lt;br /&gt;
                q.append((ii, y, w))&lt;br /&gt;
        elif a[x][y][w] == 3:&lt;br /&gt;
            ii = x - 1&lt;br /&gt;
            if inmat(ii, y, w, n) and a[ii][y][w] != 1 and b[ii][y][w] == 0:&lt;br /&gt;
                b[ii][y][w] = b[x][y][w] + 1&lt;br /&gt;
                q.append((ii, y, w))&lt;br /&gt;
        elif a[x][y][w] == 2:&lt;br /&gt;
            ii = x + 1&lt;br /&gt;
            if inmat(ii, y, w, n) and a[ii][y][w] != 1 and b[ii][y][w] == 0:&lt;br /&gt;
                b[ii][y][w] = b[x][y][w] + 1&lt;br /&gt;
                q.append((ii, y, w))&lt;br /&gt;
&lt;br /&gt;
    return b[ifi][jfi][kfi]&lt;br /&gt;
&lt;br /&gt;
def verificare_restrictii(n, z, sa, sd, g):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100 and 1 &amp;lt;= z &amp;lt;= 30000 and 1 &amp;lt;= sa &amp;lt;= sd &amp;lt;= 200 and 1 &amp;lt;= g &amp;lt;= 10000):&lt;br /&gt;
        with open(&amp;quot;turnOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;turnIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
    n = int(f.readline().strip())&lt;br /&gt;
    z, sa, sd, g = map(int, f.readline().split())&lt;br /&gt;
    if not verificare_restrictii(n, z, sa, sd, g):&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
    a = [[[0 for _ in range(n + 1)] for _ in range(n + 1)] for _ in range(n + 1)]&lt;br /&gt;
    for _ in range(z):&lt;br /&gt;
        x, y, w = map(int, f.readline().split())&lt;br /&gt;
        a[x][y][w] = 1&lt;br /&gt;
    for _ in range(sa):&lt;br /&gt;
        x, y, w = map(int, f.readline().split())&lt;br /&gt;
        a[x][y][w] = 2&lt;br /&gt;
    for _ in range(sd):&lt;br /&gt;
        x, y, w = map(int, f.readline().split())&lt;br /&gt;
        a[x][y][w] = 3&lt;br /&gt;
    for _ in range(g):&lt;br /&gt;
        x, y, w = map(int, f.readline().split())&lt;br /&gt;
        a[x][y][w] = 4&lt;br /&gt;
    is_, js, ks = map(int, f.readline().split())&lt;br /&gt;
    ifi, jfi, kfi = map(int, f.readline().split())&lt;br /&gt;
&lt;br /&gt;
result = lee(n, a, is_, js, ks, ifi, jfi, kfi)&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;turnOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
    if result is not None:&lt;br /&gt;
        f.write(str(result))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1856_-_Taxe&amp;diff=9667</id>
		<title>1856 - Taxe</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1856_-_Taxe&amp;diff=9667"/>
		<updated>2024-02-23T06:52:14Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==  Enunt ==&lt;br /&gt;
&lt;br /&gt;
Într-o ţară în care corupţia este în floare şi economia la pământ, pentru a obţine toate aprobările necesare în scopul demarării unei afaceri, investitorul trebuie să treacă prin mai multe camere ale unei clădiri în care se află birouri.&lt;br /&gt;
&lt;br /&gt;
Clădirea are un singur nivel în care birourile sunt lipite unele de altele formând un caroiaj pătrat de dimensiune &amp;lt;code&amp;gt;n•n&amp;lt;/code&amp;gt;. Pentru a facilita accesul în birouri, toate camerele vecine au uşi între ele. În fiecare birou se află un funcţionar care pretinde o taxă de trecere prin cameră (taxă ce poate fi, pentru unele camere, egală cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;). Investitorul intră încrezător prin colţul din stânga-sus al clădirii (cum se vede de sus planul clădirii) şi doreşte să ajungă în colţul opus al clădirii, unde este ieşirea, plătind o taxă totală cât mai mică.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Ştiind că el are în buzunar &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; euro şi că fiecare funcţionar îi ia taxa de cum intră în birou, se cere să se determine dacă el poate primi aprobările necesare şi, în caz afirmativ, care este suma maximă de bani care îi rămâne în buzunar la ieşirea din clădire.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;taxe2IN.txt&amp;lt;/code&amp;gt; conţine pe prima linie cele două numere &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; despărţite printr-un spaţiu, 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 separate prin spaţii ce reprezintă taxele cerute de funcţionarii din fiecare birou.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;taxe2OUT.txt&amp;lt;/code&amp;gt; conţine o singură linie pe care se află numărul maxim de euro care îi rămân în buzunar sau valoarea &amp;lt;code&amp;gt;–1&amp;lt;/code&amp;gt; dacă investitorului nu-i ajung banii pentru a obţine aprobarea. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3 ≤ N ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ S ≤ 10000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Valorile reprezentând taxele cerute de funcţionarii din birouri sunt numere naturale, o taxă nedepășind valoarea de &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; de euro.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;taxe2IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 10 3&lt;br /&gt;
 1 2 5&lt;br /&gt;
 1 3 1&lt;br /&gt;
 0 8 1&lt;br /&gt;
&amp;lt;code&amp;gt;taxe2OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;taxe2IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 2&lt;br /&gt;
 1 2 &lt;br /&gt;
 1 3 &lt;br /&gt;
&amp;lt;code&amp;gt;taxe2OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def read_input(filename=&amp;quot;taxe2IN.txt&amp;quot;):&lt;br /&gt;
    with open(filename, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        s, n = map(int, file.readline().split())&lt;br /&gt;
        a = [list(map(int, file.readline().split())) for _ in range(n)]&lt;br /&gt;
    return s, n, a&lt;br /&gt;
&lt;br /&gt;
def write_output(result, filename=&amp;quot;taxe2OUT.txt&amp;quot;):&lt;br /&gt;
    with open(filename, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
        file.write(str(result))&lt;br /&gt;
&lt;br /&gt;
def verify_restrictions(s, n, a):&lt;br /&gt;
    if not (3 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= s &amp;lt;= 10000):&lt;br /&gt;
        return False&lt;br /&gt;
    for row in a:&lt;br /&gt;
        for tax in row:&lt;br /&gt;
            if not (0 &amp;lt;= tax &amp;lt;= 200):&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def solve(s, n, a):&lt;br /&gt;
    # Inițializează o matrice pentru a stoca costurile minime de a ajunge la fiecare celulă&lt;br /&gt;
    b = [[float(&#039;inf&#039;)] * n for _ in range(n)]&lt;br /&gt;
    b[0][0] = a[0][0]  # Costul de a ajunge la celula de start este costul celulei de start&lt;br /&gt;
&lt;br /&gt;
    # Utilizează BFS pentru a explora toate căile posibile&lt;br /&gt;
    queue = [(0, 0)]&lt;br /&gt;
    while queue:&lt;br /&gt;
        x, y = queue.pop(0)&lt;br /&gt;
        for dx, dy in [(0, 1), (1, 0), (-1, 0), (0, -1)]:  # Explorează în toate direcțiile&lt;br /&gt;
            nx, ny = x + dx, y + dy&lt;br /&gt;
            if 0 &amp;lt;= nx &amp;lt; n and 0 &amp;lt;= ny &amp;lt; n:&lt;br /&gt;
                new_cost = b[x][y] + a[nx][ny]&lt;br /&gt;
                if new_cost &amp;lt; b[nx][ny]:&lt;br /&gt;
                    b[nx][ny] = new_cost&lt;br /&gt;
                    queue.append((nx, ny))&lt;br /&gt;
&lt;br /&gt;
    return s - b[n-1][n-1] if b[n-1][n-1] &amp;lt;= s else -1&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    s, n, a = read_input()&lt;br /&gt;
    if not verify_restrictions(s, n, a):&lt;br /&gt;
        write_output(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        result = solve(s, n, a)&lt;br /&gt;
        write_output(result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2249_-_panouri&amp;diff=9666</id>
		<title>2249 - panouri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2249_-_panouri&amp;diff=9666"/>
		<updated>2024-02-23T06:15:47Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt == &lt;br /&gt;
&lt;br /&gt;
Pe autostrada Soarele Estului sunt aşezate de-a lungul şoselei, la distanţe egale, panouri publicitare ale unor firme. Aceeaşi firmă, poate să aibă mai multe panouri publicitare şi fiecare panou poate să apară în mai multe locuri. Panourile se identifică prin numere naturale, numărul total de panouri fiind &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Firma X Corporation are panouri de &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; tipuri diferite. Firma a primit aprobarea construirii unui mare complex turistic în apropierea autostrăzii; de aceea, pentru alegerea locului, este interesată şi de următorul aspect: care este lungimea minimă de şosea, în care se pot întâlni, toate cele &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; tipuri de panouri publicitare ale firmei, indiferent de ordinea acestora, şi indiferent dacă între ele se mai interpun sau nu panouri ale altor firme.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; – numărul total de panouri de la marginea autostrăzii şi ordinea amplasării lor, ca şi cele &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; tipuri de panouri amplasate de firmă, determinaţi numărul minim de intervale dintre două panouri între care firma X Corporation îşi regăsește toate panourile sale.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;panouriIN.txt&amp;lt;/code&amp;gt; are pe prima linie numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;. Pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii, sunt &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale, nu neapărat diferite, câte unul pe linie, reprezentând panourile, iar începând cu linia &amp;lt;code&amp;gt;N + 2&amp;lt;/code&amp;gt;, câte unul pe linie, cele &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; tipuri de panouri diferite al firmei.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;panouriOUT.txt&amp;lt;/code&amp;gt; va conţine pe prima linie un singur număr întreg pozitiv &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;, reprezentând numărul cerut, sau &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; în caz că nu există soluţie. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 15000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ T ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Toate numerele reprezentând panouri sunt numere naturale din intervalul &amp;lt;code&amp;gt;[1..1000]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;panouriIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 2&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
 5&lt;br /&gt;
 3&lt;br /&gt;
 1&lt;br /&gt;
 5&lt;br /&gt;
 1&lt;br /&gt;
&amp;lt;code&amp;gt;panouriOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;panouriIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 2&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
 5&lt;br /&gt;
 3&lt;br /&gt;
 1&lt;br /&gt;
 5&lt;br /&gt;
 1&lt;br /&gt;
&amp;lt;code&amp;gt;panouriOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def read_input():&lt;br /&gt;
    with open(&amp;quot;panouriIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        n, t = map(int, file.readline().split())&lt;br /&gt;
        v = []&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            panou = file.readline().strip()&lt;br /&gt;
            if panou:&lt;br /&gt;
                v.append(int(panou))&lt;br /&gt;
        panou_firma = set()&lt;br /&gt;
        for _ in range(t):&lt;br /&gt;
            panou = file.readline().strip()&lt;br /&gt;
            if panou:&lt;br /&gt;
                panou_firma.add(int(panou))&lt;br /&gt;
    return n, t, v, panou_firma&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def write_output(result):&lt;br /&gt;
    with open(&amp;quot;panouriOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
        file.write(str(result))&lt;br /&gt;
&lt;br /&gt;
def validate_constraints(n, t, v, panou_firma):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 15000 and 1 &amp;lt;= t &amp;lt;= 1000):&lt;br /&gt;
        write_output(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    for panou in v:&lt;br /&gt;
        if not 1 &amp;lt;= panou &amp;lt;= 1000:&lt;br /&gt;
            write_output(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def solve_problem(n, t, v, panou_firma):&lt;br /&gt;
    fr = [0] * 1001&lt;br /&gt;
    firma = []&lt;br /&gt;
    lmin = 100000&lt;br /&gt;
    k = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if v[i] in panou_firma:&lt;br /&gt;
            firma.append((v[i], i))&lt;br /&gt;
            if fr[v[i]] == 0:&lt;br /&gt;
                k += 1&lt;br /&gt;
            fr[v[i]] += 1&lt;br /&gt;
&lt;br /&gt;
        if k == t:&lt;br /&gt;
            while firma and fr[firma[0][0]] &amp;gt; 1:&lt;br /&gt;
                fr[firma[0][0]] -= 1&lt;br /&gt;
                firma.pop(0)&lt;br /&gt;
            lmin = min(lmin, i - firma[0][1])&lt;br /&gt;
            fr[firma[0][0]] = 0&lt;br /&gt;
            firma.pop(0)&lt;br /&gt;
            k -= 1&lt;br /&gt;
&lt;br /&gt;
    return lmin&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, t, v, panou_firma = read_input()&lt;br /&gt;
    if validate_constraints(n, t, v, panou_firma):&lt;br /&gt;
        result = solve_problem(n, t, v, panou_firma)&lt;br /&gt;
        write_output(result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0144_-_copii&amp;diff=9665</id>
		<title>0144 - copii</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0144_-_copii&amp;diff=9665"/>
		<updated>2024-02-22T20:23:18Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
În Bistriţa sunt &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; copii, fiecare dintre ei având un număr preferat &amp;lt;code&amp;gt;Xi&amp;lt;/code&amp;gt; . Copii se aşează pe un rând, cu poziţiile 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;. După ce copii s-au aşezat, profesoara de educaţie fizică le cere să execute &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; mişcări de tipul &amp;lt;code&amp;gt;(a, b)&amp;lt;/code&amp;gt;, cu semnificaţia că îşi vor schimba ordinea copiii care se află între poziţiile &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, inclusiv.&lt;br /&gt;
&lt;br /&gt;
= Cerință =&lt;br /&gt;
Să se răspundă la &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; întrebări de tipul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, cu semnificaţia: care este numărul preferat al copilului, care se află pe poziţia &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, după executarea mişcărilor cerute de profesoara de educaţie fizică.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul &amp;lt;code&amp;gt;copiiIN.txt&amp;lt;/code&amp;gt; are pe prima linie un număr natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Pe linia a 2-a sunt &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere &amp;lt;code&amp;gt;Xi&amp;lt;/code&amp;gt; , separate prin câte un spațiu, cu semnificaţia din enunţ. Pe linia a 3-a este numărul &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;. Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se găseșc câte un două numere &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; cu semnificația de mai sus. Pe următoarea linie se află numărul &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;. Pe următoarele linii se află câte un număr &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, cu semnificaţia de mai sus.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul &amp;lt;code&amp;gt;copiiOUt.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; linii. Pe fiecare linie se va afla răspunsul la întrebarea respectivă din fişierul de intrare. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 10.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Q ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ a ≤ b ≤ N&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-2.000.000.000 ≤ Xi&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;≤ 2.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;copiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 10&lt;br /&gt;
 1 2 3 4 5 6 7 8 9 10&lt;br /&gt;
 2&lt;br /&gt;
 2 5&lt;br /&gt;
 4 8&lt;br /&gt;
 6&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 4&lt;br /&gt;
 5&lt;br /&gt;
 8&lt;br /&gt;
 10&lt;br /&gt;
&amp;lt;code&amp;gt;copiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 5&lt;br /&gt;
 8&lt;br /&gt;
 7&lt;br /&gt;
 3&lt;br /&gt;
 10&lt;br /&gt;
&lt;br /&gt;
== Explicaţie ==&lt;br /&gt;
După prima mişcare şirul format din numerele preferate ale copiilor devine: &amp;lt;code&amp;gt;1 5 4 3 2 6 7 8 9 10&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;copiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100001&lt;br /&gt;
 1 2 3 4 5 6 7 8 9 10&lt;br /&gt;
 2&lt;br /&gt;
 2 5&lt;br /&gt;
 4 8&lt;br /&gt;
 6&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 4&lt;br /&gt;
 5&lt;br /&gt;
 8&lt;br /&gt;
 10&lt;br /&gt;
&amp;lt;code&amp;gt;copiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verificare_restrictii(N, M, Q, updates):&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 100000 and 1 &amp;lt;= M &amp;lt;= 10000 and 1 &amp;lt;= Q &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    for x, y in updates:&lt;br /&gt;
        if not (-2000000000 &amp;lt;= x &amp;lt;= 2000000000 and -2000000000 &amp;lt;= y &amp;lt;= 2000000000 and 1 &amp;lt;= x &amp;lt;= y &amp;lt;= N):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;copiiIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;copiiOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        a = [0] + list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
        m = int(fin.readline().strip())&lt;br /&gt;
        updates = [tuple(map(int, fin.readline().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
        q = int(fin.readline().strip())&lt;br /&gt;
&lt;br /&gt;
        if not verificare_restrictii(n, m, q, updates):&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        for _ in range(q):&lt;br /&gt;
            p = int(fin.readline().strip())&lt;br /&gt;
            for j in range(m - 1, -1, -1):&lt;br /&gt;
                x, y = updates[j]&lt;br /&gt;
                if x &amp;lt;= p &amp;lt;= y:&lt;br /&gt;
                    p = x + y - p&lt;br /&gt;
            fout.write(str(a[p]) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2460_-_multimi5https:/wiki.universitas.ro/wiki/2460_-_multimi5&amp;diff=9664</id>
		<title>2460 - multimi5https:/wiki.universitas.ro/wiki/2460 - multimi5</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2460_-_multimi5https:/wiki.universitas.ro/wiki/2460_-_multimi5&amp;diff=9664"/>
		<updated>2024-02-22T20:06:29Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
O mulțime cu elemente numere naturale poate fi scrisă într-o formă redusă dacă, ordonând crescător elementele ei, diferența dintre oricare două valori alăturate este aceeași. De exemplu, mulțimea &amp;lt;code&amp;gt;D={11, 14, 17, 20, 23}&amp;lt;/code&amp;gt; poate fi scrisă sub forma &amp;lt;code&amp;gt;D=11-23/3&amp;lt;/code&amp;gt;, precizând elementul minim, elementul maxim și diferența dintre elemente. Date fiind &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; mulțimi scrise sub forma redusă, fiecare fiind notată cu o literă mare a alfabetului englez, se cere să se calculeze o expresie care poate conține:&lt;br /&gt;
&lt;br /&gt;
* operația de reuniune, notată cu &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;;&lt;br /&gt;
* operația de intersecție, notată cu &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;;&lt;br /&gt;
* literele asociate mulțimilor;&lt;br /&gt;
* paranteze rotunde.&lt;br /&gt;
&lt;br /&gt;
Considerăm că valoarea expresiei este mulțimea obținută după efectuarea operațiilor specifice mulțimilor considerând că operațiile de intersecție au prioritate mai mare decât cele de reuniune.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând forma redusă a celor &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; mulțimi și o expresie, să se calculeze valoarea expresiei date.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Datele de intrare se citesc din fişierul &amp;lt;code&amp;gt;multimi5IN.txt&amp;lt;/code&amp;gt;, care are următoarea structură:&lt;br /&gt;
&lt;br /&gt;
- Pe prima linie se află numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, reprezentând numărul mulțimilor;&lt;br /&gt;
&lt;br /&gt;
- Pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii se află formele reduse ale celor &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; mulțimi, câte o mulțime pe fiecare linie;&lt;br /&gt;
&lt;br /&gt;
- Pe linia &amp;lt;code&amp;gt;N+2&amp;lt;/code&amp;gt; se află expresia ce trebuie calculată.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Datele de ieşire se vor scrie în fişierul &amp;lt;code&amp;gt;multimi5OUT.txt&amp;lt;/code&amp;gt;, astfel:&lt;br /&gt;
&lt;br /&gt;
- Pe prima linie se va scrie numărul elementelor mulțimii obținute în urma evalării expresiei date;&lt;br /&gt;
&lt;br /&gt;
- Pe linia a doua se vor scrie, în ordine crescătoare, elementele mulțimii respctive, separate prin câte un spațiu. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 &amp;lt; N ≤ 16&amp;lt;/code&amp;gt;&lt;br /&gt;
* Elementele mulțimilor sunt numere naturale cuprinse între &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1.000.000.000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Numărul elementelor unei mulțimi este maximum &amp;lt;code&amp;gt;10.000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Numărul caracterelor expresiei este cuprins între &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Forma redusă a unei mulțimi și expresia dată nu conțin spații;&lt;br /&gt;
* Se garantează că, pentru toate datele de test, valoarea expresiei nu poate fi mulțimea vidă;&lt;br /&gt;
* Se garantează că, în teste care totalizează &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; de puncte, expresia nu conține paranteze;&lt;br /&gt;
* Se garantează că, în teste care totalizează &amp;lt;code&amp;gt;60&amp;lt;/code&amp;gt; de puncte, cardinalul fiecărei mulțimi date la intrare nu depășește valoarea &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;multimi5IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 A=2-8/2&lt;br /&gt;
 C=11-23/3&lt;br /&gt;
 B=4-16/4&lt;br /&gt;
 A*(B+C)&lt;br /&gt;
&amp;lt;code&amp;gt;multimi5OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 4 8&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Mulțimile au următoarele elemente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;A={2, 4, 6, 8}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;B={4, 8,12, 16}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C={11, 14, 17, 20, 23}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Efectuând operațiile obținem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;B+C = {4, 8, 11, 12, 14, 16, 17, 20, 23}&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;A*(B+C) = {4, 8}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;multimi5.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 17&lt;br /&gt;
 A=2-8/2&lt;br /&gt;
 C=11-23/3&lt;br /&gt;
 B=4-16/4&lt;br /&gt;
 A*(B+C)&lt;br /&gt;
&amp;lt;code&amp;gt;multimi5.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare: ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def parseaza_set(linie):&lt;br /&gt;
    parti = linie.split(&#039;=&#039;)&lt;br /&gt;
    if len(parti) != 2:&lt;br /&gt;
        return None &lt;br /&gt;
    _, definitie_interval = parti&lt;br /&gt;
    inceput, rest = definitie_interval.split(&#039;-&#039;)&lt;br /&gt;
    sfarsit, pas = rest.split(&#039;/&#039;)&lt;br /&gt;
    return set(range(int(inceput), int(sfarsit) + 1, int(pas)))&lt;br /&gt;
&lt;br /&gt;
def verifica_restricții(n, seturi, expresie):&lt;br /&gt;
    if not (1 &amp;lt; n &amp;lt;= 16):&lt;br /&gt;
        return False&lt;br /&gt;
    for set in seturi.values():&lt;br /&gt;
        if set is None or not all(0 &amp;lt;= elem &amp;lt;= 1000000000 for elem in set) or len(set) &amp;gt; 10000:&lt;br /&gt;
            return False&lt;br /&gt;
    if not (3 &amp;lt;= len(expresie) &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def evalueaza_expresie(A, B, C):&lt;br /&gt;
    return A.intersection(B.union(C))&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;multimi5IN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
&lt;br /&gt;
        seturi = {}&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            linie = fin.readline().strip()&lt;br /&gt;
            set_nume = linie[0]&lt;br /&gt;
            set = parseaza_set(linie)&lt;br /&gt;
            if set is None:&lt;br /&gt;
                with open(&amp;quot;multimi5OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                    fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                return  &lt;br /&gt;
            seturi[set_nume] = set&lt;br /&gt;
&lt;br /&gt;
        expresie = fin.readline().strip() &lt;br /&gt;
&lt;br /&gt;
    if not verifica_restricții(n, seturi, expresie):&lt;br /&gt;
        with open(&amp;quot;multimi5OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    A, B, C = seturi[&#039;A&#039;], seturi[&#039;B&#039;], seturi[&#039;C&#039;]&lt;br /&gt;
    rezultat = evalueaza_expresie(A, B, C)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;multimi5OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{len(rezultat)}\n&amp;quot;)&lt;br /&gt;
        for element in sorted(rezultat):&lt;br /&gt;
            fout.write(f&amp;quot;{element} &amp;quot;)&lt;br /&gt;
        fout.write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0687_-_liste&amp;diff=9663</id>
		<title>0687 - liste</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0687_-_liste&amp;diff=9663"/>
		<updated>2024-02-22T20:03:05Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt == &lt;br /&gt;
&lt;br /&gt;
Numim listă un sir de numere naturale. Avem la dispoziţie mai multe liste aşezate, în ordine, una sub alta. Spunem că două liste &amp;lt;code&amp;gt;L1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;L2&amp;lt;/code&amp;gt; sunt vecine dacă &amp;lt;code&amp;gt;L1&amp;lt;/code&amp;gt; este imediat deasupra lui &amp;lt;code&amp;gt;L2&amp;lt;/code&amp;gt;, sau dacă &amp;lt;code&amp;gt;L2&amp;lt;/code&amp;gt; este imediat deasupra lui &amp;lt;code&amp;gt;L1&amp;lt;/code&amp;gt;. Oricare două liste vecine &amp;lt;code&amp;gt;L1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;L2&amp;lt;/code&amp;gt; pot fi unificate dacă ele au cel puţin un element comun. Prin unificare, noua listă va avea ca elemente toate elementele din &amp;lt;code&amp;gt;L1&amp;lt;/code&amp;gt; la care se adaugă toate elementele din &amp;lt;code&amp;gt;L2&amp;lt;/code&amp;gt;. Listele &amp;lt;code&amp;gt;L1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;L2&amp;lt;/code&amp;gt; vor dispărea şi în locul lor va apărea noua listă.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Determinaţi numărul minim de liste care rezultă după aplicarea unui număr suficient de unificări astfel încât să nu mai existe două liste vecine care să poată fi unificate.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul &amp;lt;code&amp;gt;listeIN.txt&amp;lt;/code&amp;gt; are pe prima linie un număr natural &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; reprezentând numărul de liste. Fiecare dintre următoarele &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; linii descriu, în ordine, câte o listă şi au structura: &amp;lt;code&amp;gt;K A[1] A[2] … A[K]&amp;lt;/code&amp;gt;. Primul element notat &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; reprezintă numărul de elemente din listă. În continuare sunt &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; numere naturale care reprezintă elementele listei. Numerele de pe aceeaşi linie sunt separate prin câte un spaţiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Pe prima linie a fişierului &amp;lt;code&amp;gt;listeOUT.txt&amp;lt;/code&amp;gt; se găseşte un singur număr natural reprezentând valoarea cerută. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ L ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* fiecare listă iniţială are cel mult &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; de elemente;&lt;br /&gt;
* valorile elementelor listelor sunt numere naturale &amp;lt;code&amp;gt;≤ 120&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;listeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 2 0 1&lt;br /&gt;
 1 0&lt;br /&gt;
 3 1 3 3&lt;br /&gt;
 1 2&lt;br /&gt;
&amp;lt;code&amp;gt;listeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;listeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100001&lt;br /&gt;
 3 1 11 111 &lt;br /&gt;
 3 2 22 112&lt;br /&gt;
 3 2 11 113&lt;br /&gt;
 3 1 22 6&lt;br /&gt;
 3 5 55 9&lt;br /&gt;
 3 7 77 9&lt;br /&gt;
 3 8 88 6&lt;br /&gt;
&amp;lt;code&amp;gt;listeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Avem patru liste. Putem unifica prima și a doua listă, acestea fiind înlocuite cu o singură lista. Apoi putem unifica lista rezultată la primul pas cu lista care iniţial era a treia. Obţinem astfel două liste care nu mai pot fi unificate.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def unifica_liste(liste):&lt;br /&gt;
    a_avut_loc_unificare = True&lt;br /&gt;
    while a_avut_loc_unificare:&lt;br /&gt;
        a_avut_loc_unificare = False&lt;br /&gt;
        liste_noi = []&lt;br /&gt;
        i = 0&lt;br /&gt;
        while i &amp;lt; len(liste):&lt;br /&gt;
            if i &amp;lt; len(liste) - 1 and liste[i].intersection(liste[i + 1]):&lt;br /&gt;
                lista_unificata = liste[i].union(liste[i + 1])&lt;br /&gt;
                liste_noi.append(lista_unificata)&lt;br /&gt;
                i += 2&lt;br /&gt;
                a_avut_loc_unificare = True&lt;br /&gt;
            else:&lt;br /&gt;
                liste_noi.append(liste[i])&lt;br /&gt;
                i += 1&lt;br /&gt;
        liste = liste_noi&lt;br /&gt;
    return len(liste)&lt;br /&gt;
&lt;br /&gt;
def citeste_date_intrare(nume_fisier_intrare):&lt;br /&gt;
    liste = []&lt;br /&gt;
    try:&lt;br /&gt;
        with open(nume_fisier_intrare, &#039;r&#039;) as f:&lt;br /&gt;
            n = int(f.readline().strip())&lt;br /&gt;
            for _ in range(n):&lt;br /&gt;
                linie = f.readline().strip().split()&lt;br /&gt;
                k, numere = int(linie[0]), list(map(int, linie[1:]))&lt;br /&gt;
                liste.append(set(numere))&lt;br /&gt;
    except:&lt;br /&gt;
        # Dacă apare orice eroare, returnăm None pentru a indica o problemă&lt;br /&gt;
        return None&lt;br /&gt;
    return liste&lt;br /&gt;
&lt;br /&gt;
def verifica_restricii(liste):&lt;br /&gt;
    if not 1 &amp;lt;= len(liste) &amp;lt;= 100000:&lt;br /&gt;
        return False&lt;br /&gt;
    for lista in liste:&lt;br /&gt;
        if not 1 &amp;lt;= len(lista) &amp;lt;= 10 or any(x &amp;lt; 0 or x &amp;gt; 120 for x in lista):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def scrie_date_iesire(nume_fisier_iesire, mesaj):&lt;br /&gt;
    with open(nume_fisier_iesire, &#039;w&#039;) as f:&lt;br /&gt;
        f.write(mesaj + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    nume_fisier_intrare = &amp;quot;listeIN.txt&amp;quot;&lt;br /&gt;
    nume_fisier_iesire = &amp;quot;listeOUT.txt&amp;quot;&lt;br /&gt;
    liste = citeste_date_intrare(nume_fisier_intrare)&lt;br /&gt;
    &lt;br /&gt;
    if liste is None or not verifica_restricii(liste):&lt;br /&gt;
        # Dacă datele sunt invalide sau nu respectă restricțiile, scriem mesajul de eroare&lt;br /&gt;
        scrie_date_iesire(nume_fisier_iesire, &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        numar_liste_finale = unifica_liste(liste)&lt;br /&gt;
        scrie_date_iesire(nume_fisier_iesire, str(numar_liste_finale))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2460_-_multimi5https:/wiki.universitas.ro/wiki/2460_-_multimi5&amp;diff=9662</id>
		<title>2460 - multimi5https:/wiki.universitas.ro/wiki/2460 - multimi5</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2460_-_multimi5https:/wiki.universitas.ro/wiki/2460_-_multimi5&amp;diff=9662"/>
		<updated>2024-02-22T18:45:25Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
O mulțime cu elemente numere naturale poate fi scrisă într-o formă redusă dacă, ordonând crescător elementele ei, diferența dintre oricare două valori alăturate este aceeași. De exemplu, mulțimea &amp;lt;code&amp;gt;D={11, 14, 17, 20, 23}&amp;lt;/code&amp;gt; poate fi scrisă sub forma &amp;lt;code&amp;gt;D=11-23/3&amp;lt;/code&amp;gt;, precizând elementul minim, elementul maxim și diferența dintre elemente. Date fiind &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; mulțimi scrise sub forma redusă, fiecare fiind notată cu o literă mare a alfabetului englez, se cere să se calculeze o expresie care poate conține:&lt;br /&gt;
&lt;br /&gt;
* operația de reuniune, notată cu &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;;&lt;br /&gt;
* operația de intersecție, notată cu &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;;&lt;br /&gt;
* literele asociate mulțimilor;&lt;br /&gt;
* paranteze rotunde.&lt;br /&gt;
&lt;br /&gt;
Considerăm că valoarea expresiei este mulțimea obținută după efectuarea operațiilor specifice mulțimilor considerând că operațiile de intersecție au prioritate mai mare decât cele de reuniune.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând forma redusă a celor &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; mulțimi și o expresie, să se calculeze valoarea expresiei date.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Datele de intrare se citesc din fişierul &amp;lt;code&amp;gt;multimi5.in&amp;lt;/code&amp;gt;, care are următoarea structură:&lt;br /&gt;
&lt;br /&gt;
- Pe prima linie se află numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, reprezentând numărul mulțimilor;&lt;br /&gt;
&lt;br /&gt;
- Pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii se află formele reduse ale celor &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; mulțimi, câte o mulțime pe fiecare linie;&lt;br /&gt;
&lt;br /&gt;
- Pe linia &amp;lt;code&amp;gt;N+2&amp;lt;/code&amp;gt; se află expresia ce trebuie calculată.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Datele de ieşire se vor scrie în fişierul &amp;lt;code&amp;gt;multimi5.out&amp;lt;/code&amp;gt;, astfel:&lt;br /&gt;
&lt;br /&gt;
- Pe prima linie se va scrie numărul elementelor mulțimii obținute în urma evalării expresiei date;&lt;br /&gt;
&lt;br /&gt;
- Pe linia a doua se vor scrie, în ordine crescătoare, elementele mulțimii respctive, separate prin câte un spațiu. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 &amp;lt; N ≤ 16&amp;lt;/code&amp;gt;&lt;br /&gt;
* Elementele mulțimilor sunt numere naturale cuprinse între &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1.000.000.000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Numărul elementelor unei mulțimi este maximum &amp;lt;code&amp;gt;10.000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Numărul caracterelor expresiei este cuprins între &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Forma redusă a unei mulțimi și expresia dată nu conțin spații;&lt;br /&gt;
* Se garantează că, pentru toate datele de test, valoarea expresiei nu poate fi mulțimea vidă;&lt;br /&gt;
* Se garantează că, în teste care totalizează &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; de puncte, expresia nu conține paranteze;&lt;br /&gt;
* Se garantează că, în teste care totalizează &amp;lt;code&amp;gt;60&amp;lt;/code&amp;gt; de puncte, cardinalul fiecărei mulțimi date la intrare nu depășește valoarea &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;multimi5.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 A=2-8/2&lt;br /&gt;
 C=11-23/3&lt;br /&gt;
 B=4-16/4&lt;br /&gt;
 A*(B+C)&lt;br /&gt;
&amp;lt;code&amp;gt;multimi5.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 4 8&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Mulțimile au următoarele elemente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;A={2, 4, 6, 8}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;B={4, 8,12, 16}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C={11, 14, 17, 20, 23}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Efectuând operațiile obținem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;B+C = {4, 8, 11, 12, 14, 16, 17, 20, 23}&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;A*(B+C) = {4, 8}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;multimi5.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 17&lt;br /&gt;
 A=2-8/2&lt;br /&gt;
 C=11-23/3&lt;br /&gt;
 B=4-16/4&lt;br /&gt;
 A*(B+C)&lt;br /&gt;
&amp;lt;code&amp;gt;multimi5.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare: ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def parseaza_set(linie):&lt;br /&gt;
    parti = linie.split(&#039;=&#039;)&lt;br /&gt;
    if len(parti) != 2:&lt;br /&gt;
        return None &lt;br /&gt;
    _, definitie_interval = parti&lt;br /&gt;
    inceput, rest = definitie_interval.split(&#039;-&#039;)&lt;br /&gt;
    sfarsit, pas = rest.split(&#039;/&#039;)&lt;br /&gt;
    return set(range(int(inceput), int(sfarsit) + 1, int(pas)))&lt;br /&gt;
&lt;br /&gt;
def verifica_restricții(n, seturi, expresie):&lt;br /&gt;
    if not (1 &amp;lt; n &amp;lt;= 16):&lt;br /&gt;
        return False&lt;br /&gt;
    for set in seturi.values():&lt;br /&gt;
        if set is None or not all(0 &amp;lt;= elem &amp;lt;= 1000000000 for elem in set) or len(set) &amp;gt; 10000:&lt;br /&gt;
            return False&lt;br /&gt;
    if not (3 &amp;lt;= len(expresie) &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def evalueaza_expresie(A, B, C):&lt;br /&gt;
    return A.intersection(B.union(C))&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;multimi5IN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
&lt;br /&gt;
        seturi = {}&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            linie = fin.readline().strip()&lt;br /&gt;
            set_nume = linie[0]&lt;br /&gt;
            set = parseaza_set(linie)&lt;br /&gt;
            if set is None:&lt;br /&gt;
                with open(&amp;quot;multimi5OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                    fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                return  &lt;br /&gt;
            seturi[set_nume] = set&lt;br /&gt;
&lt;br /&gt;
        expresie = fin.readline().strip() &lt;br /&gt;
&lt;br /&gt;
    if not verifica_restricții(n, seturi, expresie):&lt;br /&gt;
        with open(&amp;quot;multimi5OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    A, B, C = seturi[&#039;A&#039;], seturi[&#039;B&#039;], seturi[&#039;C&#039;]&lt;br /&gt;
    rezultat = evalueaza_expresie(A, B, C)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;multimi5OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{len(rezultat)}\n&amp;quot;)&lt;br /&gt;
        for element in sorted(rezultat):&lt;br /&gt;
            fout.write(f&amp;quot;{element} &amp;quot;)&lt;br /&gt;
        fout.write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3222_-_treasure&amp;diff=9635</id>
		<title>3222 - treasure</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3222_-_treasure&amp;diff=9635"/>
		<updated>2024-02-13T10:04:15Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt == &lt;br /&gt;
&lt;br /&gt;
Andrei este un aventurier care a plecat în căutarea unei comori pline cu bănuți de aur. Când a ajuns la ultimul indiciu, cel care ii va spune în ce loc se află comoara, a văzut ca pe indiciu sunt scrise doua numere naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, iar pe a doua linie un sir de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; caractere, litere mici ale alfabetului englez. Andrei trebuie să ia șirul curent și să elimine prima secvență de &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; litere identice care apar pe poziții consecutive. El va relua acest procedeu până când nu va mai exista nicio secvență de &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; litere identice consecutive. Andrei vă roagă să-l ajutați să rezolve cât mai repede această problemă pentru a putea ajunge primul la comoară.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Fiind date &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, numere naturale și un șir de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; litere mici ale alfabetului englez, trebuie să eliminați mereu prima secvență de &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; caractere identice aflate pe poziții consecutive până nu va mai exista nicio astfel de secvență.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Se vor citi de la tastatura pe prima linie două numere naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, iar pe a doua linie un sir de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; litere mici ale alfabetului englez.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Se va afișa pe ecran un sir care reprezintă șirul final pe care îl obținem după ce am efectuat toate eliminările posibile. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ K ≤ N ≤ 200.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Toate caracterele șirului inițial sunt litere mici ale alfabetului englez&lt;br /&gt;
* Se garantează că la final șirul nu va fi vid!&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5 2&lt;br /&gt;
 abbac&lt;br /&gt;
Ieșire&lt;br /&gt;
 c&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Șirul inițial : &amp;lt;code&amp;gt;abbac&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Șirul după prima eliminare: &amp;lt;code&amp;gt;aac&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Șirul după a doua eliminare: &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 1 1&lt;br /&gt;
 1&lt;br /&gt;
Ieșire&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def check_restrictions(n, k, s):&lt;br /&gt;
    if not (2 &amp;lt;= k &amp;lt;= n &amp;lt;= 200000):&lt;br /&gt;
        return False&lt;br /&gt;
    s_str = &#039;&#039;.join(s)&lt;br /&gt;
    if not s_str.islower():&lt;br /&gt;
        return False&lt;br /&gt;
    if not s:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, k = map(int, input().split())&lt;br /&gt;
    s = list(input())&lt;br /&gt;
    if not check_restrictions(n, k, s):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    ok = 0&lt;br /&gt;
    while ok == 0:&lt;br /&gt;
        ctm = 1&lt;br /&gt;
        ok = 1&lt;br /&gt;
        elem = 0&lt;br /&gt;
        rez = [0] * (n + 1)&lt;br /&gt;
        for x in range(n):&lt;br /&gt;
            elem += 1&lt;br /&gt;
            rez[elem] = s[x]&lt;br /&gt;
            if x &amp;lt; n - 1 and s[x] == s[x + 1]:&lt;br /&gt;
                ctm += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if ctm &amp;gt;= k:&lt;br /&gt;
                    elem -= k&lt;br /&gt;
                    ok = 0&lt;br /&gt;
                ctm = 1&lt;br /&gt;
        if ctm &amp;gt;= k:&lt;br /&gt;
            elem -= k&lt;br /&gt;
        s = [&#039;\0&#039;] * n&lt;br /&gt;
        for x in range(1, elem + 1):&lt;br /&gt;
            s[x - 1] = rez[x]&lt;br /&gt;
        n = elem&lt;br /&gt;
    for x in range(1, elem + 1):&lt;br /&gt;
        print(rez[x], end=&amp;quot;&amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3239_-_chain&amp;diff=9634</id>
		<title>3239 - chain</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3239_-_chain&amp;diff=9634"/>
		<updated>2024-02-13T09:35:26Z</updated>

		<summary type="html">&lt;p&gt;Aurelia Raluca: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Se dă o secvență de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi &amp;lt;code&amp;gt;a1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;a2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;aN&amp;lt;/code&amp;gt;. Pentru fiecare element &amp;lt;code&amp;gt;ak&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;k = 1, 2, ...,n&amp;lt;/code&amp;gt;) vom determina primul element mai mare decât &amp;lt;code&amp;gt;ak&amp;lt;/code&amp;gt;, dacă există. Îl notăm cu &amp;lt;code&amp;gt;ak1&amp;lt;/code&amp;gt;. Apoi, pentru &amp;lt;code&amp;gt;ak1&amp;lt;/code&amp;gt; facem același lucru și elementul găsit îl notăm cu &amp;lt;code&amp;gt;ak2&amp;lt;/code&amp;gt;, și așa mai departe până ieșim în afara șirului. Se formează secvența &amp;lt;code&amp;gt;ak1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ak2&amp;lt;/code&amp;gt;, …, pe care o numim chain începând cu poziția &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieți un program care, pentru orice poziție &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; afișează lungimea secvenței chain corespunzătoare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Pe prima linie a intrării standard se dă valoarea &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Pe a doua linie se dau elementele șirului, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Pe o linie a ieșirii standard, programul va scrie șirul valorilor ce reprezintă lungimile secvențelor chain corespunzătoare elementelor șirului de intrare. Fiecare două numere consecutive trebuie separate printr-un singur spațiu. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; N &amp;lt; 500.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; ai&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;lt; 1.000.000&amp;lt;/code&amp;gt;, pentru fiecare &amp;lt;code&amp;gt;i = 1..N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 11&lt;br /&gt;
 3 2 4 2 11 2 7 5 8 10 6&lt;br /&gt;
Ieșire&lt;br /&gt;
 2 2 1 1 0 3 2 2 1 0 0&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 0&lt;br /&gt;
 123&lt;br /&gt;
Ieșire&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, a):&lt;br /&gt;
    if not (0 &amp;lt; n &amp;lt; 500000):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if not (0 &amp;lt; a[i] &amp;lt; 1000000):&lt;br /&gt;
            return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
    return &amp;quot;Datele corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    a = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    mesaj = verifica_restrictii(n, a)&lt;br /&gt;
    if mesaj != &amp;quot;Datele corespund restrictiilor impuse&amp;quot;:&lt;br /&gt;
        print(mesaj)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    p = [0]*n&lt;br /&gt;
    d = [0]*n&lt;br /&gt;
&lt;br /&gt;
    # O(n)&lt;br /&gt;
    s = []&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        s.append(i-1)&lt;br /&gt;
        while s:&lt;br /&gt;
            j = s[-1]&lt;br /&gt;
            if a[j] &amp;gt;= a[i]:&lt;br /&gt;
                break&lt;br /&gt;
            if a[j] &amp;lt; a[i]:&lt;br /&gt;
                p[j] = i&lt;br /&gt;
                s.pop()&lt;br /&gt;
&lt;br /&gt;
    # chains&lt;br /&gt;
    d[n-1] = 0&lt;br /&gt;
    for i in range(n-2, -1, -1):&lt;br /&gt;
        if p[i] == 0:&lt;br /&gt;
            d[i] = 0&lt;br /&gt;
        else:&lt;br /&gt;
            d[i] = 1 + d[p[i]]&lt;br /&gt;
&lt;br /&gt;
    print(&#039; &#039;.join(map(str, d)))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurelia Raluca</name></author>
	</entry>
</feed>