Submission #1281625

#TimeUsernameProblemLanguageResultExecution timeMemory
1281625SSKMFDango Maker (JOI18_dango_maker)C++20
13 / 100
5 ms584 KiB
#include <bits/stdc++.h>
using namespace std;

vector <int> adiacenta[1000001];
int inlocuitor[3000][3000] , pereche[3000001] , moment[1000001];
char matrice[3000][3001];

inline bool CautaPereche (const int nod)
{
    if (moment[nod] == moment[0])
        { return false; }

    moment[nod] = moment[0];
    for (auto& vecin : adiacenta[nod]) {
        if (!pereche[vecin])
        {
            pereche[vecin] = nod;
            pereche[nod] = vecin;
            return true;
        }
    }
    
    for (auto& vecin : adiacenta[nod]) {
        if (CautaPereche(pereche[vecin]))
        {
            pereche[vecin] = nod;
            pereche[nod] = vecin;
            return true;
        }
    }

    return false;
}

int main ()
{
    ios :: sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    int linii , coloane;
    cin >> linii >> coloane;

    for (int linie = 0 ; linie < linii ; linie++)
        { cin >> matrice[linie]; }
    
    int numar_noduri_1 = 0;
    for (int linie = 0 ; linie < linii ; linie++) {
        for (int coloana = 0 ; coloana < coloane ; coloana++) {
            if (matrice[linie][coloana] == 'R' && ((coloana + 2 < coloane && matrice[linie][coloana + 1] == 'G' && matrice[linie][coloana + 2] == 'W') || (linie + 2 < linii && matrice[linie + 1][coloana] == 'G' && matrice[linie + 2][coloana] == 'W')))
                { inlocuitor[linie][coloana] = ++numar_noduri_1; }
        }
    }
    
    int numar_noduri_2 = 0;
    for (int linie = 0 ; linie < linii ; linie++) {
        for (int coloana = 0 ; coloana < coloane ; coloana++) {
            if (matrice[linie][coloana] == 'W' && ((coloana - 2 >= 0 && matrice[linie][coloana - 1] == 'G' && matrice[linie][coloana - 2] == 'R') || (linie - 2 >= 0 && matrice[linie - 1][coloana] == 'G' && matrice[linie - 2][coloana] == 'R')))
                { inlocuitor[linie][coloana] = ++numar_noduri_2 + numar_noduri_1; }
        }
    }

    for (int linie = 0 ; linie < linii ; linie++) {
        for (int coloana = 0 ; coloana < coloane ; coloana++) {
            if (matrice[linie][coloana] == 'R' && inlocuitor[linie][coloana])
            {
                if (coloana + 2 < coloane && matrice[linie][coloana + 1] == 'G' && matrice[linie][coloana + 2] == 'W')
                    { adiacenta[inlocuitor[linie][coloana]].push_back(inlocuitor[linie][coloana + 2]); }
                if (linie + 2 < linii && matrice[linie + 1][coloana] == 'G' && matrice[linie + 2][coloana] == 'W')
                    { adiacenta[inlocuitor[linie][coloana]].push_back(inlocuitor[linie + 2][coloana]); }
            }
        }
    }

    int cuplaj = 0;
    while (true)
    {
        moment[0]++;
        bool gasit = false;
        for (int nod = 1 ; nod <= numar_noduri_1 ; nod++) {
            if (!pereche[nod] && CautaPereche(nod))
                { gasit = true; cuplaj++; }
        }

        if (!gasit)
            { break; }
    }

    cout << cuplaj;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...