3607 - Run

De la Universitas MediaWiki

Cerinţa

În această dimineață Aky, un băiat sportiv, s-a hotărât să meargă la alergat. Acesta vrea după ce ajunge acasă să își rezolve tema la informatică și pentru asta trebuie să nu fie foarte obosit în urma antrenamentului, deci vrea să își aleagă un traseu cât mai ușor pe care să alerge, iar pentru asta și-a pus la punct un plan foarte exact.

Acesta are în orașul său o distanță N kilometri legați, numerotați de la 1 la N, iar fiecărui kilometru i din cele N(1 ≤ i ≤ N) îi cunoaște gradul de dificultate a[i]. Băiatul a întocmit o listă cu M intervale diferite de kilometri de forma [l, r], fiecare interval având un anumit grad de oboseală asociat acestuia. Gradul de oboseală G asociat unui interval [l, r] de lungime L = r - l + 1 se calculează astfel: G = a[l] * L + a[l + 1] * (L - 1) + ... + a[r - 1] * 2 + a[r] * 1 și reprezintă cu cât va crește valoarea de oboseală a lui Aky dupa ce va alerga kilometrii intervalului respectiv. Acum Aky vă cere vouă să-l ajutați să-și ducă planul la sfârșit, aflând care este valoarea minimă de oboseală pe care o poate avea la finalul antrenamentului său, știind că trebuie sa alerge kilometrii a exact K din intervalele din lista sa.

Date de intrare

Fişierul de intrare run.in are pe prima linie numerele N M K, reprezentând numărul de kilometri din orașul lui Aky, numărul de intervale din lista sa, respectiv câte dintre intervale trebuie să aleagă pentru alergat, pe a 2-a linie N numere naturale a[1], a[2], ..., a[N], reprezentând gradele de dificultate ale celor N kilometri, iar pe următoarele M linii câte 2 numere l r reprezentând intervalele din lista lui Aky.

Date de ieșire

Fişierul de ieşire run.out va conţine pe prima linie numărul natural V, reprezentând valoarea minimă de oboseală pe care o poate avea băiatul la finalul antrenamentului său.

Restricţii şi precizări

  • 1 ≤ N, M ≤ 100.000
  • 1 ≤ K ≤ M
  • 1 ≤ a[i] ≤ 10.000
  • 1 ≤ l ≤ r ≤ n
  • pentru teste în valoare de 50 de puncte N ≤ 5.000 și M ≤ 5.000

Exemplul 1

run.in

5 5 3 2 3 1 5 6 1 3 1 4 3 4 2 5 4 5

run.out

36

Explicație

Vom lua fiecare interval și vom calcula gradul său de oboseală:

  • [1, 3]: G = 2 * 3 + 3 * 2 + 1 * 1 = 13
  • [1, 4]: G = 2 * 4 + 3 * 3 + 1 * 2 + 5 * 1 = 24
  • [3, 4]: G = 1 * 2 + 5 * 1 = 7
  • [2, 5]: G = 3 * 4 + 1 * 3 + 5 * 2 + 6 * 1 = 31
  • [4, 5]: G = 5 * 2 + 6 * 1 = 16

Obținem în final gradele de oboseală 13 24 7 31 16 din care Aky trebuie să aleagă 3 astfel încât valoarea sa de oboseală să fie minimă. Acesta elege primul, al treilea, respectiv ultimul interval obținând valoarea de oboseală minimă 13 + 7 + 16 = 36.


Rezolvare

with open("run.in", "r") as fin:
    N, M, K = map(int, fin.readline().split())
    difficulties = list(map(int, fin.readline().split()))
    intervals = [tuple(map(int, fin.readline().split())) for _ in range(M)]

def fatigue(interval, difficulties):
    l, r = interval
    fatigue_value = 0
    for i in range(l, r + 1):
        fatigue_value += difficulties[i - 1] * (r - i + 1)
    return fatigue_value

sorted_intervals = sorted(intervals, key=lambda interval: fatigue(interval, difficulties))
min_fatigue = sum(fatigue(interval, difficulties) for interval in sorted_intervals[:K])

with open("run.out", "w") as fout:
    fout.write(str(min_fatigue))