1512 - Mars: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/1512/mars 1512 - Mars] ---- == Cerinţa == Se consideră un tablou unidimensional cu n elemente numere întregi, numerotate de la 1 la n, inițial toate nule. Asupra tabloului se fac m operații s d X cu semnificația: toate elementele cu indici cuprinși între s și d își măresc valoarea cu X. Să se afișeze tabloul după realizarea celor m operații. == Date de intrare == Programul citește de la tastatură numerele n m, iar apoi...
 
Flaviu (talk | contribs)
No edit summary
Line 10: Line 10:


== Date de ieșire ==  
== Date de ieșire ==  
Programul va afișa pe ecran cele n elemente ale tabloului, separate prin exact un spațiu.
Dacă datele sunt introduse corect, pe ecran se va afișa:
'''"Datele sunt introduse corect."''', apoi pe un rând nou '''numărul c''', reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: '''"Datele nu corespund restricțiilor impuse."'''.


== Restricţii şi precizări ==
== Restricţii şi precizări ==
Line 27: Line 28:
: 1 1 -1
: 1 1 -1
; Ieșire
; Ieșire
: Datele nu corespund restricțiilor impuse.
: Datele sunt introduse correct
: -1 0 -3 -3 9 6 6 6 6 -1
: -1 0 -3 -3 9 6 6 6 6 -1


Line 33: Line 36:
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
# 1512 - Mars
# 1512 - Mars
def read_input():
    n, m = map(int, input().split())
    return n, m, [0] * n


def update_array(arr, s, d, X):
    for i in range(s-1, d):
        arr[i] += X


def solve(n, m, arr):
def citire_date():
     for _ in range(m):
    n, m = map(int, input().split())
    op = []
     for i in range(m):
         s, d, X = map(int, input().split())
         s, d, X = map(int, input().split())
         update_array(arr, s, d, X)
         op.append((s, d, X))
     return arr
     return n, m, op


def validate(n, m, arr):
def aplicare_operatii(n, m, op):
     assert len(arr) == n
     v = [0] * n
    for s, d, X in op:
        if s > n or d > n or s < 1 or d < 1 or s > d or abs(X) > 1000:
            print("Datele nu corespund restricțiilor impuse.")
            return
        for i in range(s-1, d):
            v[i] += X
    print("Datele sunt introduse corect.")
    print(*v)


if __name__ == '__main__':
if __name__ == '__main__':
     n, m, arr = read_input()
     n, m, op = citire_date()
     arr = solve(n, m, arr)
     aplicare_operatii(n, m, op)
    validate(n, m, arr)
    print(*arr)





Revision as of 18:48, 27 April 2023

Sursa: 1512 - Mars


Cerinţa

Se consideră un tablou unidimensional cu n elemente numere întregi, numerotate de la 1 la n, inițial toate nule. Asupra tabloului se fac m operații s d X cu semnificația: toate elementele cu indici cuprinși între s și d își măresc valoarea cu X.

Să se afișeze tabloul după realizarea celor m operații.

Date de intrare

Programul citește de la tastatură numerele n m, iar apoi m triplete s d X, cu semnificația din enunț.


Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou numărul c, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".

Restricţii şi precizări

  • 1 ≤ n ≤ 200.000
  • 1 ≤ m ≤ 200.000
  • 1 ≤ s ≤ d ≤ n
  • -1000 ≤ X ≤ 1000

Exemplu

Intrare
10 6
8 10 2
3 10 -3
5 9 7
5 5 5
6 7 2
1 1 -1
Ieșire
Datele nu corespund restricțiilor impuse.
Datele sunt introduse correct
-1 0 -3 -3 9 6 6 6 6 -1

Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

  1. 1512 - Mars


def citire_date():

   n, m = map(int, input().split())
   op = []
   for i in range(m):
       s, d, X = map(int, input().split())
       op.append((s, d, X))
   return n, m, op

def aplicare_operatii(n, m, op):

   v = [0] * n
   for s, d, X in op:
       if s > n or d > n or s < 1 or d < 1 or s > d or abs(X) > 1000:
           print("Datele nu corespund restricțiilor impuse.")
           return
       for i in range(s-1, d):
           v[i] += X
   print("Datele sunt introduse corect.")
   print(*v)

if __name__ == '__main__':

   n, m, op = citire_date()
   aplicare_operatii(n, m, op)


</syntaxhighlight>

Explicatie Rezolvare

Funcția read_input() primește datele de intrare de la utilizator și returnează n, m și tabloul inițial. Funcția update_array() primește un tablou arr, o pereche de indici s și d și o valoare X, și actualizează toate elementele din arr cu indici cuprinși între s și d astfel încât să fie adăugate la ele valoarea X. Funcția solve() primește n, m și tabloul inițial, iterează prin cele m operații și actualizează tabloul conform operațiilor. Funcția validate() verifică dacă tabloul rezultat are lungimea corectă. În if __name__ == '__main__', apelăm funcțiile în ordine pentru a rezolva problema și afișăm tabloul rezultat.