3796 - qtsume: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
Flaviu (talk | contribs)
No edit summary
 
Line 53: Line 53:
# 3796 - qtsume
# 3796 - qtsume


def calc_sum(a, x, y):
def validate_input(N, Q, A, intrebari):
     sum = 0
    if not (1 <= N <= 100000 and 1 <= Q <= 100000):
    for i in range(x, y+1):
        return False
        sum += (i-x+1)*a[i-1]
    for a in A:
     return sum
        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__":
if __name__ == "__main__":
     # Citirea datelor de intrare
     # Citire date de intrare
     n = int(input())
     with open("qtsume.in", "r") as fin:
    a = list(map(int, input().split()))
        N = int(fin.readline().strip())
    q = int(input())
        A = list(map(int, fin.readline().split()))
    queries = []
        Q = int(fin.readline().strip())
    for i in range(q):
        intrebari = [tuple(map(int, line.strip().split())) for line in fin.readlines()]
        x, y = map(int, input().split())
        queries.append((x, y))


     # Verificarea datelor de intrare
     # Verificare date de intrare
     if n <= 0 or n > 100000 or q <= 0 or q > 100000:
     if not validate_input(N, Q, A, intrebari):
         print("Datele nu corespund restricțiilor impuse.")
         with open("qtsume.out", "w") as fout:
            fout.write("Datele nu corespund restricțiilor impuse.")
     else:
     else:
         for x, y in queries:
         # Rezolvare problema
            if x < 1 or x > n or y < 1 or y > n or x > y:
        result = solve(N, A, intrebari)
                print("Datele nu corespund restricțiilor impuse.")
                break
            else:
                print("Datele sunt introduse corect.")
                print(calc_sum(a, x, y))


        # 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 86: Line 99:
== Explicatie Rezolvare ==
== 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ță.
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.


Î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.
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.


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.
Î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]

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]

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]

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]

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

Exemplu 1[edit]

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]

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]

Rezolvare ver. 1[edit]

<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]

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.