3796 - qtsume: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
Flaviu (talk | contribs)
No edit summary
 
(One intermediate revision by the same user not shown)
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 validate_input(N, Q, A, intrebari):
    n = int(input())
     if not (1 <= N <= 100000 and 1 <= Q <= 100000):
    v = list(map(int, input().split()))
    q = int(input())
    intrebari = []
    for i in range(q):
        x, y = map(int, input().split())
        intrebari.append((x, y))
    return n, v, q, intrebari
 
def validare(n, v, q, intrebari):
     if len(v) != n:
         return False
         return False
     for x in v:
     for a in A:
         if x < 1 or x > 1000000:
         if not (1 <= a <= 1000000):
             return False
             return False
    if q < 1 or q > 100000:
        return False
     for x, y in intrebari:
     for x, y in intrebari:
         if x < 1 or x > n or y < 1 or y > n or x > y:
         if not (1 <= x <= y <= N):
             return False
             return False
     return True
     return True


def calc_suma(x, y, v):
def solve(N, A, intrebari):
     suma = 0
     result = []
    for i in range(x-1, y):
    for x, y in intrebari:
        suma += (i-x+1+1)*v[i]
        s = 0
     return suma
        for i in range(x-1, y):
            s += (i-x+2) * A[i]
        result.append(s)
     return result
 
if __name__ == "__main__":
    # Citire date de intrare
    with open("qtsume.in", "r") as fin:
        N = int(fin.readline().strip())
        A = list(map(int, fin.readline().split()))
        Q = int(fin.readline().strip())
        intrebari = [tuple(map(int, line.strip().split())) for line in fin.readlines()]


if __name__ == '__main__':
     # Verificare date de intrare
     n, v, q, intrebari = citire_date()
     if not validate_input(N, Q, A, intrebari):
     if validare(n, v, q, intrebari):
         with open("qtsume.out", "w") as fout:
         print("Datele sunt introduse corect.")
             fout.write("Datele nu corespund restricțiilor impuse.")
        for x, y in intrebari:
             suma = calc_suma(x, y, v)
            print(suma)
     else:
     else:
         print("Datele nu corespund restricțiilor impuse.")
         # Rezolvare problema
        result = solve(N, A, intrebari)
 
        # Scriere rezultat
        with open("qtsume.out", "w") as fout:
            fout.write("Datele sunt introduse corect.\n")
            for s in result:
                fout.write(str(s) + "\n")




Line 80: Line 99:
== 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 validate_input(N, Q, A, intrebari) primește ca parametrii numărul de elemente din vectorul A, numărul de întrebări, vectorul A și o listă cu perechi de întrebări. Funcția verifică dacă datele de intrare corespund restricțiilor impuse și returnează True dacă da și False în caz contrar.
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ț.
Funcția solve(N, A, intrebari) primește ca parametrii numărul de elemente din vectorul A, vectorul A și o listă cu perechi de întrebări. Funcția rezolvă problema conform cerințelor și returnează o listă cu valorile cerute pentru fiecare întrebare.
Î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.
 
În if __name__ == "__main__": se citesc datele de intrare din fișierul "qtsume.in" și se verifică dacă acestea sunt corecte folosind funcția validate_input(). În cazul în care datele sunt corecte, se rezolvă problema cu ajutorul funcției solve() și se scrie rezultatul în fișierul "qtsume.out". În caz contrar, se scrie un mesaj corespunzător în fișierul de ieșire.

Latest revision as of 21:00, 14 May 2023

Sursa: 3796 - qtsume


Cerinţa[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

  • 1 ≤ N, Q ≤ 100.000
  • 1 ≤ A[i] ≤ 1.000.000
  • 1 ≤ x ≤ y ≤ N

Exemplu 1[edit | edit source]

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[edit | edit source]

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[edit | edit source]

Rezolvare ver. 1[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 3796 - qtsume

def validate_input(N, Q, A, intrebari):

   if not (1 <= N <= 100000 and 1 <= Q <= 100000):
       return False
   for a in A:
       if not (1 <= a <= 1000000):
           return False
   for x, y in intrebari:
       if not (1 <= x <= y <= N):
           return False
   return True

def solve(N, A, intrebari):

   result = []
   for x, y in intrebari:
       s = 0
       for i in range(x-1, y):
           s += (i-x+2) * A[i]
       result.append(s)
   return result

if __name__ == "__main__":

   # Citire date de intrare
   with open("qtsume.in", "r") as fin:
       N = int(fin.readline().strip())
       A = list(map(int, fin.readline().split()))
       Q = int(fin.readline().strip())
       intrebari = [tuple(map(int, line.strip().split())) for line in fin.readlines()]
   # Verificare date de intrare
   if not validate_input(N, Q, A, intrebari):
       with open("qtsume.out", "w") as fout:
           fout.write("Datele nu corespund restricțiilor impuse.")
   else:
       # Rezolvare problema
       result = solve(N, A, intrebari)
       # Scriere rezultat
       with open("qtsume.out", "w") as fout:
           fout.write("Datele sunt introduse corect.\n")
           for s in result:
               fout.write(str(s) + "\n")


</syntaxhighlight>

Explicatie Rezolvare[edit | edit source]

Funcția validate_input(N, Q, A, intrebari) primește ca parametrii numărul de elemente din vectorul A, numărul de întrebări, vectorul A și o listă cu perechi de întrebări. Funcția verifică dacă datele de intrare corespund restricțiilor impuse și returnează True dacă da și False în caz contrar.

Funcția solve(N, A, intrebari) primește ca parametrii numărul de elemente din vectorul A, vectorul A și o listă cu perechi de întrebări. Funcția rezolvă problema conform cerințelor și returnează o listă cu valorile cerute pentru fiecare întrebare.

În if __name__ == "__main__": se citesc datele de intrare din fișierul "qtsume.in" și se verifică dacă acestea sunt corecte folosind funcția validate_input(). În cazul în care datele sunt corecte, se rezolvă problema cu ajutorul funcției solve() și se scrie rezultatul în fișierul "qtsume.out". În caz contrar, se scrie un mesaj corespunzător în fișierul de ieșire.