3796 - qtsume: Difference between revisions
No edit summary |
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 sunt introduse corect. | |||
: Datele sunt introduse | : : 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 | 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()) | ||
a = list(map(int, input().split())) | |||
q = int(input()) | q = int(input()) | ||
queries = [] | |||
for i in range(q): | for i in range(q): | ||
x, y = map(int, input().split()) | x, y = map(int, input().split()) | ||
queries.append((x, y)) | |||
# Verificarea datelor de intrare | |||
if | 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 | |||
for x, y in | else: | ||
print("Datele sunt introduse corect.") | |||
print(calc_sum(a, x, y)) | |||
Line 80: | Line 86: | ||
== Explicatie Rezolvare == | == Explicatie Rezolvare == | ||
Funcția | 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. |
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>
- 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.