1233 - Paint

De la Universitas MediaWiki

Roberto are suflet de artist. El visează să ajungă într-o bună zi un pictor celebru, dar pentru moment își câştigă existența ca zugrav.

Roberto a primit sarcina de a zugrăvi un zid având lungimea n metri şi înălţimea un metru. Pentru aceasta are la dispoziţie m zile. În fiecare zi i, el acoperă cu un singur strat de vopsea o porţiune compactă de înălțime un metru și de lungime l[i] metri, începând de la distanţa d[i] metri faţă de capătul din stânga al zidului.

Roberto ştie din experienţă că fiecare porţiune de zid trebuie acoperită cu cel puţin K straturi de vopsea pentru ca stratul final de vopsea să aibă consistenţa dorită. Din nefericire, firea lui de artist nu i-a permis să-şi poată planifica munca în mod optim, astfel că la capătul celor m zile de efort, Roberto a constatat că zidul are porţiuni pe care le-a acoperit de mai mult de k ori şi alte porţiuni pe care le-a acoperit de mai puţin de k ori.

Pentru a recupera în proprii săi ochi dar mai ales în ochii şefului de echipă, el trebuie să afle mai întâi suprafaţa totală a tuturor porţiunilor de zid care mai trebuie zugrăvite.

Cerinţă

Cunoscând lungimea zidului n, numărul de zile m şi porţiunile compacte pe care le zugrăveşte în fiecare zi, determinaţi suprafaţa totală a zidului care mai trebuie zugrăvită.

Date de intrare

Fișierul de intrare input.txt conține pe prima linie trei numerele naturale n k m separate printr-un spațiu, unde n este lungimea zidului, k este numărul minim de straturi de vopsea pentru a se obţine consistenţa dorită, iar m este numărul de zile în care Roberto pictează.

Pe următoarele m linii se află câte două valori naturale separate prin câte un spațiu. Numerele d[i] şi l[i] de pe linia i+1 reprezintă distanţa faţă de capătul din stânga al zidului de la care începe să zugrăvească în ziua i, respectiv lungimea în metri a porţiunii de zid zugrăvite în ziua i.

Date de ieșire

Fișierul de ieșire output.txt va conține pe prima linie un număr natural S care reprezintă suprafaţa totală a zidului care nu a fost acoperită cu cel puţin k straturi de vopsea.

Restricții și precizări

  • 1 ≤ n, m ≤ 250 000

Exemplul 1

input.txt:

5 2 3

0 2

1 3

2 3

output.txt:

2

Explicație:

n = 5, k = 2, m = 3.

În prima zi Roberto vopsește 2 m din zid între pozițiile 0 și 2. În a doua zi Roberto vopsește 3 m din zid între pozițiile 1 și 4. În a treia zi Roberto vopsește 3 m din zid între pozițiile 2 și 5.

Deci, începând cu capătul din stânga al zidului, se va găsi o porțiune de zid de lungime 1, acoperită cu un singur strat și începând de la distanța 4 față de capăt, se va găsi o altă porțiune de zid de lungime 1, acoperită cu un singur strat.

Exemplul 2

input.txt:

9999999999999999 2 3

0 2

1 3

2 3

Output:

Invalid input. Please ensure 1 <= n, m <= 250,000.

Rezolvare

def validate_input(n, m):
    if not (1 <= n <= 250000) or not (1 <= m <= 250000):
        print("Invalid input. Please ensure 1 <= n, m <= 250,000.")
        exit()


with open("input.txt", "r") as fin, open("output.txt", "w") as fout:
    n, k, m = map(int, fin.readline().split())
    validate_input(n, m)
    a = [0] * (n + 3)

    for _ in range(m):
        d, L = map(int, fin.readline().split())
        a[d] += 1
        a[d + L] -= 1

    D = 0
    cnt = 0

    for i in range(n + 1):
        cnt += a[i]
        if cnt < k:
            D += 1

    fout.write(str(D - 1) + '\n')