3796 - qtsume

De la Universitas MediaWiki

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

# 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))

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.