1901 - Median Heaps

De la Universitas MediaWiki

Cerința

Se dă un vector de N numere naturale nenule, indexat de la 1.
Se cere să se raspundă la Q interogări de tipul:

  • pentru un interval [l, r] din vector, aflați costul total mimin, al egalizării tuturor elementelor din interval.

Într-un interval [l, r], puteți crește sau micșora fiecare element cu costul x unde x este diferența dintre valoarea nouă și valoarea inițială. Costul total este suma acestor costuri.

Date de intrare

  • pe prima linie numărul N.
  • pe a doua linie N numere naturale nenule : x1 ,x2 , … xN.
  • pe a treia linie numărul Q.
  • pe următoarele Q linii 2 numere: l, r.

Date de ieșire

Se vor afișa Q numere pe fiecare linie, reprezentând constul total minim, al fiecărui interval l r.

Restricții și precizări

  • 1 ≤ N, Q ≤ 100.000
  • 1 ≤ l ≤ r ≤ 100.000
  • 1 ≤ xi ≤ 1.000.000.000

Exemplul 1

Intrare
9
3 2 16 15 12 6 20 4 5
3
2 7
2 2
3 8
Ieșire
31
0
29


Exemplul 2

Intare
5
1 2 3 4 5
2
1 4
3 5
Ieșire
9
6


Rezolvare

#1901 - Median Heaps
def is_valid_input(N, Q, x_values, queries):
    if not (1 <= N <= 100000 and 1 <= Q <= 100000):
        return False
    if not all(1 <= xi <= 1000000000 for xi in x_values):
        return False
    if not all(1 <= l <= r <= N for l, r in queries):
        return False
    return True


def minimize_costs(N, x_values, Q, queries):
    result = []
    for l, r in queries:
        interval = x_values[l - 1:r]
        min_value = min(interval)
        cost = sum(min_value - xi for xi in interval)
        result.append(cost)
    return result


if __name__ == "__main__":
    try:
        # Citire date de intrare
        N = int(input())
        x_values = list(map(int, input().split()))
        Q = int(input())
        queries = [tuple(map(int, input().split())) for _ in range(Q)]

        # Verificare restricții
        if not is_valid_input(N, Q, x_values, queries):
            print("Fals")
        else:
            # Calcul și afișare rezultate
            results = minimize_costs(N, x_values, Q, queries)
            for result in results:
                print(result)

    except ValueError:
        print("Fals")

 Explicatie 

Pentru intervalul [2, 7], costul total minim este 31, deoarece egalizăm fiecare număr din interval cu 12.
Pentru intervalul [2, 2], costul total minim este 0, deoarece avem un singur element în interval.
Pentru intervalul [3, 8], costul total minim este 29, deoarece egalizăm fiecare număr din interval cu 12.