3796 - qtsume: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
Flaviu (talk | contribs)
No edit summary
Line 18: Line 18:
* 1 ≤ A[i] ≤ 1.000.000
* 1 ≤ A[i] ≤ 1.000.000
* 1 ≤ x ≤ y ≤ N  
* 1 ≤ x ≤ y ≤ N  
== Exemplu 1 ==
; Intrare
; Intrare
: 5
: 5
Line 26: Line 28:
: 2 4
: 2 4
; Ieșire
; Ieșire
: Datele nu corespund restricțiilor impuse.
: Datele sunt introduse corect.
: Datele sunt introduse correct.
: : 5
: 5
: 48
: 48
: 14
: 14
== Exemplu 2 ==
; Intrare
: 100000
: 1 2 3 4 5 6 7 8 9 10
: 100000
: 1 100001
: 1 50000
: 50001 100000
: 3 3
: 50000 50000
: 100000 100000
; Ieșire
: Datele nu corespund restricțiilor impuse.


== Rezolvare ==  
== Rezolvare ==  
Line 37: Line 53:
# 3796 - qtsume
# 3796 - qtsume


def citire_date():
def calc_sum(a, x, y):
    sum = 0
    for i in range(x, y+1):
        sum += (i-x+1)*a[i-1]
    return sum
 
if __name__ == "__main__":
    # Citirea datelor de intrare
     n = int(input())
     n = int(input())
     v = list(map(int, input().split()))
     a = list(map(int, input().split()))
     q = int(input())
     q = int(input())
     intrebari = []
     queries = []
     for i in range(q):
     for i in range(q):
         x, y = map(int, input().split())
         x, y = map(int, input().split())
         intrebari.append((x, y))
         queries.append((x, y))
    return n, v, q, intrebari


def validare(n, v, q, intrebari):
    # Verificarea datelor de intrare
     if len(v) != n:
     if n <= 0 or n > 100000 or q <= 0 or q > 100000:
        return False
         print("Datele nu corespund restricțiilor impuse.")
    for x in v:
     else:
        if x < 1 or x > 1000000:
        for x, y in queries:
            return False
            if x < 1 or x > n or y < 1 or y > n or x > y:
    if q < 1 or q > 100000:
                print("Datele nu corespund restricțiilor impuse.")
         return False
                break
     for x, y in intrebari:
            else:
        if x < 1 or x > n or y < 1 or y > n or x > y:
                print("Datele sunt introduse corect.")
            return False
                print(calc_sum(a, x, y))
    return True
 
def calc_suma(x, y, v):
    suma = 0
    for i in range(x-1, y):
        suma += (i-x+1+1)*v[i]
    return suma


if __name__ == '__main__':
    n, v, q, intrebari = citire_date()
    if validare(n, v, q, intrebari):
        print("Datele sunt introduse corect.")
        for x, y in intrebari:
            suma = calc_suma(x, y, v)
            print(suma)
    else:
        print("Datele nu corespund restricțiilor impuse.")




Line 80: Line 86:
== Explicatie Rezolvare ==
== Explicatie Rezolvare ==


Funcția citire_date() citește datele de intrare și le returnează sub forma unor variabile: n pentru numărul de elemente din vectorul A, v pentru vectorul A, q pentru numărul de întrebări și intrebari pentru o listă de tupluri, fiecare tuplu reprezentând o întrebare.
Funcția calc_sum primește ca argumente vectorul a și intervalul [x, y] și calculează suma cerută, iterând prin fiecare element din interval și aplicând formula specificată în cerință.
Funcția validare() verifică dacă datele de intrare respectă restricțiile cerute în enunț, returnând True dacă datele sunt valide și False în caz contrar.
 
Funcția calc_suma() calculează suma cerută pentru o întrebare, pe baza formulei din enunț.
În blocul if __name__ == "__main__": citim datele de intrare și le verificăm. Dacă datele sunt introduse corect, iterăm prin fiecare pereche de întrebări și calculăm suma cerută, afișând-o pe ecran.
În funcția main(), se verifică dacă datele de intrare sunt valide și se afișează mesajul corespunzător. Dacă datele sunt valide, se calculează suma pentru fiecare întrebare și se afișează rezultatul.
 
Pentru verificarea datelor de intrare, folosim condițiile specificate în cerință și verificăm dacă valorile pentru x și y se află în intervalul [1, n] și x ≤ y. Dacă datele nu corespund restricțiilor, afișăm un mesaj de eroare și oprimm executarea.

Revision as of 22:34, 13 May 2023

Sursa: 3796 - qtsume


Cerinţa

Se dă un vector A cu N numere naturale. Pentru Q întrebări de forma (x, y) aflați rezultatul sumei A[x] + 2 * A[x + 1] + ... + (y - x + 1) * A[y].


Date de intrare

Fișierul de intrare qtsume.in conține pe prima linie numărul N, iar pe a doua linie N numere naturale separate prin spații, reprezentând vectorul A. Pe următoarea linie se află numărul Q. Urmează Q linii, pe fiecare linie se află două numere naturale separate printr-un spațiu reprezentând x și y.

Date de ieșire

Fișierul de ieșire qtsume.out va conține

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, Q ≤ 100.000
  • 1 ≤ A[i] ≤ 1.000.000
  • 1 ≤ x ≤ y ≤ N

Exemplu 1

Intrare
5
3 1 2 3 5
3
1 2
1 5
2 4
Ieșire
Datele sunt introduse corect.
: 5
48
14

Exemplu 2

Intrare
100000
1 2 3 4 5 6 7 8 9 10
100000
1 100001
1 50000
50001 100000
3 3
50000 50000
100000 100000
Ieșire
Datele nu corespund restricțiilor impuse.


Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

  1. 3796 - qtsume

def calc_sum(a, x, y):

   sum = 0
   for i in range(x, y+1):
       sum += (i-x+1)*a[i-1]
   return sum

if __name__ == "__main__":

   # Citirea datelor de intrare
   n = int(input())
   a = list(map(int, input().split()))
   q = int(input())
   queries = []
   for i in range(q):
       x, y = map(int, input().split())
       queries.append((x, y))
   # Verificarea datelor de intrare
   if n <= 0 or n > 100000 or q <= 0 or q > 100000:
       print("Datele nu corespund restricțiilor impuse.")
   else:
       for x, y in queries:
           if x < 1 or x > n or y < 1 or y > n or x > y:
               print("Datele nu corespund restricțiilor impuse.")
               break
           else:
               print("Datele sunt introduse corect.")
               print(calc_sum(a, x, y))


</syntaxhighlight>

Explicatie Rezolvare

Funcția calc_sum primește ca argumente vectorul a și intervalul [x, y] și calculează suma cerută, iterând prin fiecare element din interval și aplicând formula specificată în cerință.

În blocul if __name__ == "__main__": citim datele de intrare și le verificăm. Dacă datele sunt introduse corect, iterăm prin fiecare pereche de întrebări și calculăm suma cerută, afișând-o pe ecran.

Pentru verificarea datelor de intrare, folosim condițiile specificate în cerință și verificăm dacă valorile pentru x și y se află în intervalul [1, n] și x ≤ y. Dacă datele nu corespund restricțiilor, afișăm un mesaj de eroare și oprimm executarea.