1695 - Oglinda

From Bitnami MediaWiki
Revision as of 16:45, 17 December 2023 by Vasiliu Costel Andrei (talk | contribs) (Pagină nouă: == Enunț == Pentru un număr natural N se consideră șirul a=(1,2,3...,N), deci a[i]=i pentru orice i, 1≤i≤N. Asupra acestui șir se pot aplica operații de două tipuri: a) la operația de tipul 1 se specifică două valori i și j, cu 1≤i≤j≤N. Efectul acestei operații asupra șirului este de oglindire a secvenței din șir care începe cu elementul de pe poziția i și se termină cu cel de pe poziția j. De exemplu, dacă în șirul a=(1,2,3,4,5,6,7) se apli...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Enunț[edit | edit source]

Pentru un număr natural N se consideră șirul a=(1,2,3...,N), deci a[i]=i pentru orice i, 1≤i≤N.

Asupra acestui șir se pot aplica operații de două tipuri:

a) la operația de tipul 1 se specifică două valori i și j, cu 1≤i≤j≤N. Efectul acestei operații asupra șirului este de oglindire a secvenței din șir care începe cu elementul de pe poziția i și se termină cu cel de pe poziția j. De exemplu, dacă în șirul a=(1,2,3,4,5,6,7) se aplică operația 3 6, atunci șirul devine a=(1,2,6,5,4,3,7). Iar în șirul a=(1,4,3,2,5,6,7), dacă se aplică operația 4 6, atunci a=(1,4,3,6,5,2,7).
b) Operația de tipul 2 conține un indice i, 1≤i≤N, și cere să afișăm valoarea elementului care se află în acel moment pe poziția i în șir.

Se consideră M astfel de operații într-o ordine dată.

Cerința[edit | edit source]

Scrieți un program care să determine și să afișeze rezultatul pentru fiecare operație de tipul 2.

Date de intrare[edit | edit source]

Fișierul de intrare oglindain.txt conține pe prima linie două numere naturale N și M, separate printr-un spațiu. Pe fiecare dintre următoarele M linii este specificată câte o operație de tipul 1 sau 2. O linie poate să conțină două sau trei numere, astfel: 1 i j (indicând o operație de tipul 1) respectiv 2 i (indicând o operație de tip 2). Valorile de pe aceeași linie sunt separate prin câte un spațiu.

Date de ieșire[edit | edit source]

Fișierul de ieșire oglindaout.txt va conține un număr de linii egal cu numărul de operații de tipul 2 care sunt definite în fișierul de intrare. Pe fiecare linie este afișat câte un număr natural reprezintând rezultatul pentru o operație de tip 2 prezentă în fișierul de intrare, în ordinea în care acestea sunt definite.

Restricții și precizări[edit | edit source]

  • 1 ⩽ N ⩽ 1.000.000
  • 1 ⩽ M ⩽ 2.000
  • Se garantează că 1 ≤ i ≤ j ≤ N la operațiile de tipul 1 și că 1 ≤ i ≤ N la operațiile de tip 2.
  • Se garantează că există cel puțin o operație de tipul 2.

Exemplul 1[edit | edit source]

Intrare
oglindain.txt
10 4
2 3
1 2 7
2 3
2 1
Ieșire
Datele de intrare corespund restricțiilor impuse
oglindaout.txt
3
6
1

Explicație[edit | edit source]

Șirul inițial este: 1 2 3 4 5 6 7 8 9 10
Rezultatul operației 2 3 are ca efect afișarea elementului de pe poziția 3 (care este chiar 3).
Rezultatul operației 1 2 7 are ca efect transformarea șirului în:
1 7 6 5 4 3 2 8 9 10.
Rezultatul operației 2 3 are ca efect afișarea elementului de pe poziția 3 (care acum este 6).
Rezultatul operației 2 1 are ca efect afișarea elementului de pe poziția 1 (care acum are valoarea 1).

Exemplul 2[edit | edit source]

Intrare
oglindain.txt
10 2023
2 3
1 2 7
2 3
2 1
Ieșire
Datele de intrare NU corespund restricțiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1695 - Oglinda

def oglinda(n, operatii):

   sir = list(range(1, n + 1))
   rezultate = []
   for operatie in operatii:
       tip = operatie[0]
       if tip == 1:
           i, j = operatie[1], operatie[2]
           sir[i - 1:j] = reversed(sir[i - 1:j])
       elif tip == 2:
           i = operatie[1]
           rezultate.append(sir[i - 1])
   with open("oglindaout.txt", "w") as output_file:
       for rezultat in rezultate:
           output_file.write(str(rezultat) + "\n")


def validare_date(n, m, operatii):

   if not (1 <= n <= 1000000):
       return False
   if not (1 <= m <= 2000):
       return False
   for operatie in operatii:
       tip = operatie[0]
       if tip == 1:
           i, j = operatie[1], operatie[2]
           if not (1 <= i <= j <= n):
               return False
       elif tip == 2:
           i = operatie[1]
           if not (1 <= i <= n):
               return False
   return True


if __name__ == "__main__":

   with open("oglindain.txt", "r") as f:
       n, m = map(int, f.readline().split())
       operatii = [list(map(int, line.split())) for line in f]
   if validare_date(n, m, operatii):
       print("Datele de intrare corespund restricțiilor impuse")
       oglinda(n, operatii)
   else:
       print("Datele de intrare NU corespund restricțiilor impuse")
       exit(0)

</syntaxhighlight>