0693 - Sahara

De la Universitas MediaWiki

Enunt

Undeva, în deșertul Sahara, ilustrul biolog Sahraa Gaea a conceput și construit un sistem de irigații ingenios, sistem cu care își propune să irige o zonă deșertică dreptunghiulară bogată în nutrienți minerali. Zona deșertică este împărțită în N*M pătrate de latură unitate. În fiecare pătrat se află un dispozitiv de picurare ce asigură o anumită cantitate de apă în funcție de comanda primită de la centrul de control al sistemului.

Sistemul de irigare este astfel conceput încât să irige (ude), pe baza unor comenzi automatizate, parcele dreptunghiulare ale regiunii deșertice.

Orice parcelă are laturile paralele cu laturile zonei deșertice și este identificată prin coordonatele colțurilor stânga-sus (x1,y1), respectiv dreapta-jos (x2,y2). La fiecare comandă se specifică parcela care va fi udată și cantitatea de apă (exprimată în litri) cu care va fi irigat fiecare pătrat al acesteia.

Un pătrat al zonei deșertice devine fertil dacă acumulează cel puțin Q litri de apă.

Cerința

Să se determine aria maximă a unei suprafețe conexe fertile. Prin aria unei suprafețe înțelegem numărul de pătrate ce compun suprafața. Orice două pătrate fertile care au o latură comună fac parte din aceeaşi suprafaţă conexă fertilă.

Date de intrare

Fişierul de intrare saharain.txt conţine pe prima linie trei numere naturale N M Q despărțite prin câte un spațiu, cu semnificația din enunț.

Pe cea de-a doua linie a fișierului se găsește un număr natural T. Pe fiecare dintre următoarele T linii se află descrierea parcelelor udate sub forma: x1 y1 x2 y2 q , adică cinci numere naturale despărțite prin spațiu, unde x1 y1 x2 y2 reprezintă coordonatele colțurilor stânga-sus, respectiv dreapta-jos ale parcelei, q2 cantitatea de apă cu care va fi irigat fiecare pătrat al parcelei.

Date de ieșire

Fişierul de ieşire saharaout.txt va conține o singură valoare ce reprezintă aria maximă a unei suprafețe conexe fertile.

Restricții și precizări

  • 2 ⩽ N, M ⩽ 1000
  • 1 ⩽ x1 ⩽ x2 ⩽ N, 1 ⩽ y1 ⩽ y2 ⩽ M
  • 1 ⩽ q ⩽ 1 000
  • 1 ⩽ Q ⩽ 10 000
  • 1 ⩽ T ⩽ 50 000
  • Inițial zona deșertică nu conține ”apă”;
  • Pot exista suprafeţe conexe fertile formate dintr-un singur pătrat fertil;
  • Parcelele se pot suprapune.

Exemplu 1

saharain.txt
8 7 5
7
1 1 3 6 1
4 2 5 7 2
2 3 4 7 3
1 2 4 3 3
5 1 6 3 4
5 5 7 6 2
6 4 8 7 3
saharaout.txt
10


Exemplu 2

saharain.txt
0 0 0
0
Nu au fost respectate cerintele impuse


Rezolvare

#0693 - Sahara
def read_input(file_name):
    try:
        with open(file_name, 'r') as file:
            N, M, Q = map(int, file.readline().split())
            T = int(file.readline())
            parcels = []

            for _ in range(T):
                x1, y1, x2, y2, q = map(int, file.readline().split())
                parcels.append(((x1, y1), (x2, y2), q))

            return N, M, Q, T, parcels
    except Exception as e:
        print(f"Nu au fost respectate cerințele impuse: {str(e)}")
        return None

def write_output(file_name, result):
    with open(file_name, 'w') as file:
        if result is not None:
            file.write(str(result) + "\n")

def max_connected_area(N, M, Q, parcels):
    area = [[0] * M for _ in range(N)]

    def flood_fill(x, y, current_area, visited):
        if x < 0 or x >= N or y < 0 or y >= M or visited[x][y] or area[x][y] < Q:
            return 0

        visited[x][y] = True
        current_area += 1

        directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
        for dx, dy in directions:
            current_area += flood_fill(x + dx, y + dy, 0, visited)

        return current_area

    max_area = 0

    for parcel in parcels:
        (x1, y1), (x2, y2), q = parcel

        for i in range(x1 - 1, x2):
            for j in range(y1 - 1, y2):
                area[i][j] += q

    visited = [[False] * M for _ in range(N)]

    for i in range(N):
        for j in range(M):
            if not visited[i][j] and area[i][j] >= Q:
                current_area = flood_fill(i, j, 0, visited)
                max_area = max(max_area, current_area)

    return max_area

def main(input_file, output_file):
    result = read_input(input_file)
    if result is not None:
        N, M, Q, T, parcels = result
        result = max_connected_area(N, M, Q, parcels)
        write_output(output_file, result)

if __name__ == "__main__":
    main("saharain.txt", "saharaout.txt")