Rezolvare completă PbInfo #693 Sahara

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 sahara.in 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 sahara.out 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

sahara.in

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

sahara.out

10

Explicație

Cantitatea de apă acumulată în solul regiunii este:

1 4 4 1 1 1 0
1 4 7 4 4 4 3
1 4 7 4 4 4 3
0 5 8 5 5 5 5
4 6 6 2 4 4 2
4 4 4 3 5 5 3
0 0 0 3 5 5 3
0 0 0 3 3 3 3

Aria maximă a unei suprafețe fertile este egală cu 10. Suprafața se consideră fertilă dacă acumulează cel puțin 5 litri de apă.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Sahara:

# include <fstream>
# include <queue>
# define NMax 1003
using namespace std;

ifstream f("sahara.in");
ofstream g("sahara.out");

short dx[]={-1, 0, 1, 0};
short dy[]={ 0, 1, 0,-1};

struct cel
{
    short l, c;
};
queue <cel> q;

int U[NMax][NMax];
int a[NMax][NMax];
int N, M, Q, nr, Max;

void fill(short l, short c)
{
    cel x, y;
    short k;
    U[l][c] = 0;
    x.l = l, x.c = c;
    q.push(x);
    while( !q.empty() )
    {
        x = q.front(); q.pop();
        for(k=0; k<4; ++k)
        {
            l = x.l + dx[k];
            c = x.c + dy[k];
            if (U[l][c] >= Q)
                {
                    U[l][c] = 0;
                    y.l = l; y.c = c;
                    q.push(y);
                    ++nr;
                }
        }
    }
}
int main()
{
    short i, j, x1, x2, y1, y2, q;
    int T, aux;

    f >> N >> M >> Q;
    f >> T;
    while ( T-- )
    {
        f >> x1 >> y1 >> x2 >> y2 >> q;
        // smenul lui Mars
        a[x1][y1] += q;
        a[x1][y2 + 1] -= q;
        a[x2 + 1][y1] -= q;
        a[x2 + 1][y2 + 1] += q;
    }
    //procesam matricea
    for (i=1; i<=N; ++i)
    {
        aux = 0;
        for (j=1; j<=M; ++j)
        {
            a[i][j] += a[i-1][j];
                aux += a[i][j];
            U[i][j]  = aux;
        }
    }

    for (i=1; i<=N; ++i)
        for(j=1; j<=M; ++j)
            if (U[i][j] >= Q)
                {
                    nr = 1;
                    fill(i, j);
                    if (nr > Max) Max = nr;
                }
    g << Max << "
";
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #693 Sahara

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #693 Sahara de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!