1164 - inception

From Bitnami MediaWiki

Enunt[edit | edit source]

În seara dinaintea probei de concurs, Cobby a avut un vis demn de un Oscar, cu mai multe evenimente. Se făcea că lumea era reprezentată ca o matrice pătratică de latură N, cu liniile și coloanele numerotate de la 1 la N, în care fiecare element era inițial vid. Privind în jur, a realizat că atunci când visează un element al matricei, situat la intersecția liniei i cu coloana j, interiorul acestuia se împarte în N linii și N coloane, ca o nouă matrice. Apoi, dacă visează la un element din matricea nou formată sau din cea inițială, se întâmplă la fel.

Pentru a nu se rătăci, eroul nopții a decis să atribuie un indice fiecărei matrice formată începând cu cea inițială căreia i-a asociat indicele 1. Matricele care se creează primesc indici numere naturale consecutive (2, 3, …), în ordinea în care se obţin. Astfel, fiecare element din visul lui Cobby este definit de 3 numere: id – indicele atribuit matricei din care face parte, i şi j – indicii liniei şi coloanei pe care se află elementul.

Cobby realizează că, oricât ar încerca, nu poate visa un element decât o singură dată. Pentru a face visul şi mai interesant, el reţine pentru fiecare matrice un număr natural denumit “coeficient de importanţă”, iniţial 0 pentru fiecare matrice din vis. Din când în când, eroul nostru alege una dintre matrice şi adaugă o valoare VAL la coeficientul de importanță al ultimelor NR matrice din care s-a obținut aceasta, inclusiv ea.

Cerința[edit | edit source]

După ce au loc toate evenimentele din vis, Cobby vrea să ştie valoarea finală a coeficientului de importanţă pentru un șir de K matrice date prin indicii lor. Deoarece el se grăbeşte să participe la Concursul Naţional Urmaşii lui Moisil, îţi revine ţie misiunea de a găsi răspunsul pentru fiecare matrice.

Date de intrare[edit | edit source]

Pe prima linie a fişierului inception.in se află valorile N – numărul de linii şi coloane din fiecare matrice, Q – numărul de evenimente care au loc în visul lui Cobby, K – numărul de matrice pentru care Cobby vrea să ştie coeficientul de importanţă. Următoarele Q linii respectă unul dintre formatele:

  • 1 id i j – Cobby visează elementul de pe linia i şi coloana j din matricea cu indicele id
  • 2 id NR VAL – Cobby adaugă valoarea VAL la coeficienţii de importanţă a NR matrice începând cu matricea cu indicele id.

Pe linia Q+2 se află K valori id1 id2 ... idK, separate prin câte un spaţiu, ce reprezintă indicii matrice lor pentru care trebuie afişată valoarea finală a coeficientului de importanţă. Evenimentele se petrec în ordinea în care sunt date în fişier.

Date de ieșire[edit | edit source]

Pe prima linie a fişierului inception.out se află K valori r1 r2 ... rK, separate prin câte un spaţiu, unde ri reprezintă coeficientul final al matricei cu id-ul id i, i din [1,K].

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

  • 1 ≤ N ≤ 500000
  • 1≤ Q ≤ 300000
  • 1≤VAL≤1000
  • 1 ≤ K, NR, id ≤ numărul total de operații de tipul 1.
  • În ambele tipuri de evenimente valoare id corespunde unei matrice

formate anterior.

  • Se garantează că există cel puţin NR matrice care pot fi modificate pentru operaţia de tipul 2.
  • Pentru 20% dintre teste orice matrice va conţine cel mult un element visat.

Exemplul 1[edit | edit source]

inceptionin.txt
3 6 3
1 1 2 3
1 2 3 3
2 3 3 5
1 1 3 1
1 2 3 1
2 5 2 3
2 1 4
inceptionout.txt
Datele introduse corespund restrictiilor impuse.
8 5 0

Exemplul 2[edit | edit source]

inceptionin.txt
0 484 0
-2 -3 -54
-86 9 2
-83 -3 5
-23 -24 0
-1 -2 -6
inceptionout.txt
Datele de intrare nu corespund restrictiilor impuse.

= Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def visul_lui_cobby(N, evenimente):

   coeficient_importanta = [0]  # Lista coeficienților de importanță pentru fiecare matrice
   matrice_curenta = [[0] * N for _ in range(N)]  # Matricea curentă
   for eveniment in evenimente:
       id, i, j, VAL, NR = eveniment
       # Creăm o nouă matrice
       matrice_noua = [[0] * N for _ in range(N)]
       # Copiem elementele din matricea curentă în matricea nouă
       for x in range(N):
           for y in range(N):
               matrice_noua[x][y] = matrice_curenta[x][y]
       # Actualizăm coeficientul de importanță pentru matricea curentă
       coeficient_importanta[-1] += VAL
       # Actualizăm ultimele NR matrice cu coeficientul de importanță
       for k in range(NR):
           coeficient_importanta[-k - 2] += VAL
       # Adaugăm coeficientul de importanță pentru matricea nouă
       coeficient_importanta.append(0)
       # Actualizăm elementul din matricea curentă și obținem matricea nouă
       matrice_noua[i - 1][j - 1] = id
       matrice_curenta = matrice_noua
   return coeficient_importanta[1:]  # Excludem primul element din lista de coeficienți

print(rezultat)


</syntaxhighlight>