3373 - culori4

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Enunț

Am o prietenă creatoare de modă. Pentru a-și realiza creațiile ea vopsește uneori materialele și mă roagă în prealabil să o ajut. Azi vrea să vopsească o pânză cu lungimea N cm folosind C nuanțe ale aceleiași culori, codificate de la 1 la C. Fiecare cm de pânză fiind colorat cu aceeași nuanță pe toată lățimea, va ieși o pânză în dungi. Inițial eu simulez cu ajutorul calculatorului vopsirea materialului, prietena mea începe apoi să intervină: de la cm A la cm B, trebuie modificată intensitatea culorii cu X puncte (intensitatea poate crește sau poate scădea, obținându-se astfel o altă nuanță). După nenumărate modificări de acest tip, să spunem M modificări, prietena mea va fi mulțumită și va trece la vopsirea efectivă a pânzei.

Cerința

Scrieţi un program care determină și afișează: 1. Lungimea maximă a unei bucăți de pânză de aceeași culoare după vopsirea inițială; 2. Cum va arăta pânza în urma modificărilor prietenei mele.

Date de intrare

Fișierul de intrare culoriin.txt conține pe prima linie cerința (1 sau 2). Linia următoare conține trei numere naturale C N M separate prin câte un spațiu, reprezentând numărul de culori, lungimea în cm a pânzei, respectiv numărul de modificări efectuate de prietena mea; următoarea linie conține N numere naturale separate prin câte un spațiu, c1 c2 c3 ... cN reprezentând culoarea fiecărui cm de pânză după vopsirea inițială, iar următoarele M linii conțin fiecare câte trei numere: două numere naturale A B, separate printr-un spațiu, reprezentând A – poziția la care începe și B – poziția finală la care se termină modificarea intensității și, separat printr-un spațiu, un număr întreg X reprezentând valoarea cu care se modifică intensitatea.

Date de ieșire

Fișierul de ieșire culoriout.txt va conține o singură linie pe care va fi scris un număr natural determinat conform cerinței, dacă cerința este 1 sau N numere naturale determinate conform cerinței, dacă cerința este 2.

Restricții și precizări

  • 1 ⩽ N ⩽ 10.000
  • 1 ⩽ C ⩽ 1.000.000
  • 1 ⩽ M ⩽ 200.000

Exemplul 1

Intrare
culoriin.txt
1
3 8 2
1 1 2 2 2 2 3 3
2 5 1
5 8 -1
Ieșire
Datele de intrare corespund restricțiilor impuse
culoriout.txt
4

Explicație

Cea mai lungă secvență de elemente egale este 2 2 2 2 și are 4 elemente

Exemplul 2

Intrare
culoriin.txt
2
3 8 2
1 1 2 2 2 2 3 3
2 5 1
5 8 -1
Ieșire
Datele de intrare corespund restricțiilor impuse
culoriout.txt
1 2 3 3 2 1 2 2

Explicație

După prima modificare vectorul este: 1 2 3 3 3 2 3 3. După a doua modificare este: 1 2 3 3 2 1 2 2.

Exemplul 3

Intrare
culoriin.txt
1
3 10001 2
1 1 2 2 2 2 3 3
2 5 1
5 8 -1
Ieșire
Datele de intrare NU corespund restricțiilor impuse

Rezolvare

#3373 - Culori4

def valideaza_date_intrare(n, c, m, culori, modificari):
    # Funcție pentru validarea datelor de intrare
    if not (0 < n < 10001):
        return False
    if not (0 < c < 1000001):
        return False
    if not (0 < m < 200001):
        return False
    if len(culori) != n:
        return False
    for culoare in culori:
        if not (1 <= culoare <= c):
            return False
    for modificare in modificari:
        a, b, x = modificare
        if not (1 <= a <= b <= n):
            return False
    return True


def proceseaza_cererea(cerere, c, n, culori, modificari):
    # Funcție pentru procesarea cererii și returnarea rezultatului
    if cerere == 1:
        # cerința 1: Lungimea maximă a unei bucăți de pânză de aceeași culoare după vopsirea inițială
        lungime_maxima = 1
        lungime_curenta = 1
        for i in range(1, n):
            if culori[i] == culori[i - 1]:
                lungime_curenta += 1
                lungime_maxima = max(lungime_maxima, lungime_curenta)
            else:
                lungime_curenta = 1
        return lungime_maxima
    elif cerere == 2:
        # cerința 2: cum va arăta pânza în urma modificărilor prietenei mele
        for modificare in modificari:
            a, b, x = modificare
            for i in range(a - 1, b):
                culori[i] = (culori[i] + x - 1) % c + 1
        return culori


def main():
    # Funcție principală care citește datele de intrare și apelează funcțiile de validare și procesare
    with open('culoriin.txt', 'r') as fisier:
        cerere = int(fisier.readline().strip())
        c, n, m = map(int, fisier.readline().split())
        culori = list(map(int, fisier.readline().split()))
        modificari = [list(map(int, fisier.readline().split())) for _ in range(m)]

    if valideaza_date_intrare(n, c, m, culori, modificari):
        print("Datele de intrare corespund restricțiilor impuse")
    else:
        print("Datele de intrare NU corespund restricțiilor impuse")
        return

    rezultat = proceseaza_cererea(cerere, c, n, culori, modificari)

    with open('culoriout.txt', 'w') as fisier:
        if cerere == 1:
            fisier.write(str(rezultat))
        elif cerere == 2:
            fisier.write(" ".join(map(str, rezultat)))


if __name__ == "__main__":
    main()