Submission #1289730

#TimeUsernameProblemLanguageResultExecution timeMemory
1289730hasandasDango Maker (JOI18_dango_maker)C++20
13 / 100
1 ms580 KiB
#include <bits/stdc++.h>
using namespace std;

int greedy_scan(const vector<string>& v, int n, int m, bool horizontal_first) {
    vector<char> used(n * m, 0);
    int cnt = 0;
    if (horizontal_first) {
        for (int i = 0; i < n; ++i)
            for (int j = 0; j + 2 < m; ++j)
                if (!used[i*m + j] && !used[i*m + (j+1)] && !used[i*m + (j+2)] &&
                    v[i][j]=='R' && v[i][j+1]=='G' && v[i][j+2]=='W') {
                    used[i*m + j] = used[i*m + (j+1)] = used[i*m + (j+2)] = 1;
                    ++cnt;
                }
        for (int i = 0; i + 2 < n; ++i)
            for (int j = 0; j < m; ++j)
                if (!used[i*m + j] && !used[(i+1)*m + j] && !used[(i+2)*m + j] &&
                    v[i][j]=='R' && v[i+1][j]=='G' && v[i+2][j]=='W') {
                    used[i*m + j] = used[(i+1)*m + j] = used[(i+2)*m + j] = 1;
                    ++cnt;
                }
    }
    else {
        for (int i = 0; i + 2 < n; ++i)
            for (int j = 0; j < m; ++j)
                if (!used[i*m + j] && !used[(i+1)*m + j] && !used[(i+2)*m + j] &&
                    v[i][j]=='R' && v[i+1][j]=='G' && v[i+2][j]=='W') {
                    used[i*m + j] = used[(i+1)*m + j] = used[(i+2)*m + j] = 1;
                    ++cnt;
                }
        for (int i = 0; i < n; ++i)
            for (int j = 0; j + 2 < m; ++j)
                if (!used[i*m + j] && !used[i*m + (j+1)] && !used[i*m + (j+2)] &&
                    v[i][j]=='R' && v[i][j+1]=='G' && v[i][j+2]=='W') {
                    used[i*m + j] = used[i*m + (j+1)] = used[i*m + (j+2)] = 1;
                    ++cnt;
                }
    }
    return cnt;
}

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

    int n, m;
    if (!(cin >> n >> m)) return 0;
    vector<string> v(n);
    for (int i = 0; i < n; ++i) cin >> v[i];

    if (n <= 0 || m <= 0) {
        cout << 0 << '\n';
        return 0;
    }

    int maybeans = max(greedy_scan(v, n, m, true), greedy_scan(v, n, m, false));

    vector<array<int,3>> seg;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j + 2 < m; ++j) {
            if (v[i][j]=='R' && v[i][j+1]=='G' && v[i][j+2]=='W') {
                seg.push_back({i*m + j, i*m + (j+1), i*m + (j+2)});
            }
        }
    }
    for (int i = 0; i + 2 < n; ++i) {
        for (int j = 0; j < m; ++j) {
            if (v[i][j]=='R' && v[i+1][j]=='G' && v[i+2][j]=='W') {
                seg.push_back({i*m + j, (i+1)*m + j, (i+2)*m + j});
            }
        }
    }

    int P = (int)seg.size();
    if (P == 0) {
        cout << 0 << '\n';
        return 0;
    }

    vector<int> cc(n * m, 0);
    for (int id = 0; id < P; ++id) {
        auto &s = seg[id];
        cc[s[0]]++;
        cc[s[1]]++;
        cc[s[2]]++;
    }
    
    priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
    for (int id = 0; id < P; ++id) {
        auto &s = seg[id];
        int loss = cc[s[0]] + cc[s[1]] + cc[s[2]] - 3;
        pq.push({loss, id});
    }

    vector<char> ac(n*m, 0);
    vector<char> segt(P, 0);
    int chosen = 0;

    while (!pq.empty()) {
        auto cur = pq.top(); pq.pop();
        int id = cur.second;
        if (segt[id]) continue;
        auto &s = seg[id];
        if (ac[s[0]] || ac[s[1]] || ac[s[2]]) continue;
        int curr_loss = cc[s[0]] + cc[s[1]] + cc[s[2]] - 3;
        if (curr_loss != cur.first) {
            pq.push({curr_loss, id});
            continue;
        }
        segt[id] = 1;
        ++chosen;
        ac[s[0]] = ac[s[1]] = ac[s[2]] = 1;
        cc[s[0]] = max(0, cc[s[0]] - 1);
        cc[s[1]] = max(0, cc[s[1]] - 1);
        cc[s[2]] = max(0, cc[s[2]] - 1);
    }

    int mightbeans = chosen;
    int ans = max(maybeans, mightbeans);
    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...