0144 - copii: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Enunt == În Bistriţa sunt N copii, fiecare dintre ei având un număr preferat Xi . Copii se aşează pe un rând, cu poziţiile numerotate de la 1 la N. După ce copii s-au aşezat, profesoara de educaţie fizică le cere să execute M mişcări de tipul (a, b), cu semnificaţia că îşi vor schimba ordinea copiii care se află între poziţiile a şi b, inclusiv. == Cerinta == Să se răspundă la Q întrebări de tipul p, cu semnificaţia: care este numărul prefe...
 
No edit summary
 
Line 1: Line 1:
== Enunt ==
== Enunt ==


În Bistriţa sunt N copii, fiecare dintre ei având un număr preferat Xi . Copii se aşează pe un rând, cu poziţiile numerotate de la 1 la N. După ce copii s-au aşezat, profesoara de educaţie fizică le cere să execute M mişcări de tipul (a, b), cu semnificaţia că îşi vor schimba ordinea copiii care se află între poziţiile a şi b, inclusiv.
În Bistriţa sunt <code>N</code> copii, fiecare dintre ei având un număr preferat <code>Xi</code> . Copii se aşează pe un rând, cu poziţiile numerotate de la <code>1</code> la <code>N</code>. După ce copii s-au aşezat, profesoara de educaţie fizică le cere să execute <code>M</code> mişcări de tipul <code>(a, b)</code>, cu semnificaţia că îşi vor schimba ordinea copiii care se află între poziţiile <code>a</code> şi <code>b</code>, inclusiv.


== Cerinta ==
= Cerință =
Să se răspundă la <code>Q</code> întrebări de tipul <code>p</code>, cu semnificaţia: care este numărul preferat al copilului, care se află pe poziţia <code>p</code>, după executarea mişcărilor cerute de profesoara de educaţie fizică.


Să se răspundă la Q întrebări de tipul p, cu semnificaţia: care este numărul preferat al copilului, care se află pe poziţia p, după executarea mişcărilor cerute de profesoara de educaţie fizică.
= Date de intrare =
Fișierul <code>copiiIN.txt</code> are pe prima linie un număr natural <code>N</code>. Pe linia a 2-a sunt <code>N</code> numere <code>Xi</code> , separate prin câte un spațiu, cu semnificaţia din enunţ. Pe linia a 3-a este numărul <code>M</code>. Pe următoarele <code>M</code> linii se găseșc câte un două numere <code>a</code> şi <code>b</code> cu semnificația de mai sus. Pe următoarea linie se află numărul <code>Q</code>. Pe următoarele linii se află câte un număr <code>p</code>, cu semnificaţia de mai sus.


== Date de intrare ==
= Date de ieșire =
Fișierul <code>copiiOUt.txt</code> va conține <code>Q</code> 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 "Datele nu corespund restrictiilor impuse".


Fișierul copii.in are pe prima linie un număr natural N. Pe linia a 2-a sunt N numere Xi , separate prin câte un spațiu, cu semnificaţia din enunţ. Pe linia a 3-a este numărul M. Pe următoarele M linii se găseșc câte un două numere a şi b cu semnificația de mai sus. Pe următoarea linie se află numărul Q. Pe următoarele linii se află câte un număr p, cu semnificaţia de mai sus.
= Restricții =


== Date de iesire ==
* <code>1 ≤ N ≤ 100.000</code>
* <code>1 ≤ M ≤ 10.000</code>
* <code>1 ≤ Q ≤ 100</code>
* <code>1 ≤ a ≤ b ≤ N</code>
* <code>-2.000.000.000 ≤ Xi</code> <code>≤ 2.000.000.000</code>


Fișierul copii.out va conține Q linii. Pe fiecare linie se va afla răspunsul la întrebarea respectivă din fişierul de intrare
= Exemplul 1: =
<code>copiiIN.txt</code>
10
1 2 3 4 5 6 7 8 9 10
2
2 5
4 8
6
1
2
4
5
8
10
<code>copiiOUT.txt</code>
1
5
8
7
3
10


== Restricții si precizari ==
== Explicaţie ==
După prima mişcare şirul format din numerele preferate ale copiilor devine: <code>1 5 4 3 2 6 7 8 9 10</code>.


*1 ≤ N ≤ 100.000
== Exemplul 2: ==
*1 ≤ M ≤ 10.000
<code>copiiIN.txt</code>
*1 ≤ Q ≤ 100
100001
*1 ≤ a ≤ b ≤ N
1 2 3 4 5 6 7 8 9 10
*-2.000.000.000 ≤ Xi ≤ 2.000.000.000
2
2 5
4 8
6
1
2
4
5
8
10
<code>copiiOUT.txt</code>
Datele nu corespund restrictiilor impuse


== Exemplul 1 ==
== Rezolvare ==


;copiiin.txt
<syntaxhighlight lang="python3" line="1">
 
def verificare_restrictii(N, M, Q, updates):
:10
    if not (1 <= N <= 100000 and 1 <= M <= 10000 and 1 <= Q <= 100):
 
        return False
:1 2 3 4 5 6 7 8 9 10
    for x, y in updates:
 
        if not (-2000000000 <= x <= 2000000000 and -2000000000 <= y <= 2000000000 and 1 <= x <= y <= N):
:2
            return False
 
    return True
:2 5
 
:4 8
 
:6
 
:1
 
:2
 
:4
 
:5
 
:8
 
:10
 
;copiiout.txt
 
:Datele introduse corespund restrictiilor impuse.
 
:c
 
== Exemplul 2 ==  
 
;copiiin.txt
 
:0
 
:-23 -2 -4 0 5 32 2 9 8 2
 
:-1


:4
def main():
    with open("copiiIN.txt", "r") as fin, open("copiiOUT.txt", "w") as fout:
        n = int(fin.readline().strip())
        a = [0] + list(map(int, fin.readline().split()))


:99
        m = int(fin.readline().strip())
 
        updates = [tuple(map(int, fin.readline().split())) for _ in range(m)]
:-6
 
:7
 
;copiiout.txt
 
:Datele de intrare nu corespund restrictiilor impuse.
 
== Rezolvare ==
 
<syntaxhighlight lang="python3" line="1">


def numar_preferat_dupa_misari(N, M, preferinte, misari, Q, intrebari):
        q = int(fin.readline().strip())
    # Inițializăm ordinea copiilor
    ordine = list(range(1, N + 1))


    # Aplicăm mișcările
         if not verificare_restrictii(n, m, q, updates):
    for misare in misari:
            fout.write("Datele nu corespund restrictiilor impuse\n")
         a, b = misare
            return
        ordine[a - 1:b] = sorted(ordine[a - 1:b])


    # Răspundem la întrebările de tipul p
        for _ in range(q):
    rezultate = []
            p = int(fin.readline().strip())
    for intrebare in intrebari:
            for j in range(m - 1, -1, -1):
        p = intrebare
                x, y = updates[j]
        numar_preferat = preferinte[ordine[p - 1] - 1]
                if x <= p <= y:
        rezultate.append(numar_preferat)
                    p = x + y - p
            fout.write(str(a[p]) + "\n")


     return rezultate
if __name__ == "__main__":
print(rezultate)
     main()


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 20:23, 22 February 2024

Enunt[edit | edit source]

În Bistriţa sunt N copii, fiecare dintre ei având un număr preferat Xi . Copii se aşează pe un rând, cu poziţiile numerotate de la 1 la N. După ce copii s-au aşezat, profesoara de educaţie fizică le cere să execute M mişcări de tipul (a, b), cu semnificaţia că îşi vor schimba ordinea copiii care se află între poziţiile a şi b, inclusiv.

Cerință[edit | edit source]

Să se răspundă la Q întrebări de tipul p, cu semnificaţia: care este numărul preferat al copilului, care se află pe poziţia p, după executarea mişcărilor cerute de profesoara de educaţie fizică.

Date de intrare[edit | edit source]

Fișierul copiiIN.txt are pe prima linie un număr natural N. Pe linia a 2-a sunt N numere Xi , separate prin câte un spațiu, cu semnificaţia din enunţ. Pe linia a 3-a este numărul M. Pe următoarele M linii se găseșc câte un două numere a şi b cu semnificația de mai sus. Pe următoarea linie se află numărul Q. Pe următoarele linii se află câte un număr p, cu semnificaţia de mai sus.

Date de ieșire[edit | edit source]

Fișierul copiiOUt.txt va conține Q 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 "Datele nu corespund restrictiilor impuse".

Restricții[edit | edit source]

  • 1 ≤ N ≤ 100.000
  • 1 ≤ M ≤ 10.000
  • 1 ≤ Q ≤ 100
  • 1 ≤ a ≤ b ≤ N
  • -2.000.000.000 ≤ Xi ≤ 2.000.000.000

Exemplul 1:[edit | edit source]

copiiIN.txt

10
1 2 3 4 5 6 7 8 9 10
2
2 5
4 8
6
1
2
4
5
8
10

copiiOUT.txt

1
5
8
7
3
10

Explicaţie[edit | edit source]

După prima mişcare şirul format din numerele preferate ale copiilor devine: 1 5 4 3 2 6 7 8 9 10.

Exemplul 2:[edit | edit source]

copiiIN.txt

100001
1 2 3 4 5 6 7 8 9 10
2
2 5
4 8
6
1
2
4
5
8
10

copiiOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def verificare_restrictii(N, M, Q, updates):

   if not (1 <= N <= 100000 and 1 <= M <= 10000 and 1 <= Q <= 100):
       return False
   for x, y in updates:
       if not (-2000000000 <= x <= 2000000000 and -2000000000 <= y <= 2000000000 and 1 <= x <= y <= N):
           return False
   return True

def main():

   with open("copiiIN.txt", "r") as fin, open("copiiOUT.txt", "w") as fout:
       n = int(fin.readline().strip())
       a = [0] + list(map(int, fin.readline().split()))
       m = int(fin.readline().strip())
       updates = [tuple(map(int, fin.readline().split())) for _ in range(m)]
       q = int(fin.readline().strip())
       if not verificare_restrictii(n, m, q, updates):
           fout.write("Datele nu corespund restrictiilor impuse\n")
           return
       for _ in range(q):
           p = int(fin.readline().strip())
           for j in range(m - 1, -1, -1):
               x, y = updates[j]
               if x <= p <= y:
                   p = x + y - p
           fout.write(str(a[p]) + "\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>