Submission #1149248

#TimeUsernameProblemLanguageResultExecution timeMemory
1149248phuonglinhn09T-Covering (eJOI19_covering)C++20
100 / 100
185 ms32056 KiB
/**
 *   author:   phuonglinhn09
 *   created:  11.02.2025
 */

#include <bits/stdc++.h>
#define fi first
#define se second

using namespace std;

typedef long long ll;

int n, m, k;
vector<vector<int>> a, tplt;
vector<vector<bool>> vis;
map<pair<int, int>, vector<pair<int, int>>> adj;

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

bool check (int x, int y) {
    return x >= 0 && x < n && y >= 0 && y < m && !vis[x][y];
}

int sum1, sum2, cnt1, cnt2;
int mi = 1e9 + 1;

void dfs(int u, int v) {
    vis[u][v] = 1;
    sum2 += a[u][v];

    cnt2++;

    for (int i = 0; i < 4; i++) {
        int x = u + dx[i], y = v + dy[i];

        if (check(x, y)) {
            mi = min (mi, a[x][y]);
            
            if (tplt[x][y] != 2) {
                vis[x][y] = 1;
                sum1 += a[x][y];
                cnt1++;
            }
        }
    }

    for (auto [i, j]:adj[{u, v}]) {
        if (!vis[i][j]) {
            dfs(i, j);
        }
    }
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> m;

    a.resize(n + 5);
    tplt.resize(n + 5);
    vis.resize(n + 5);

    for (int i = 0; i < n; i++) {
        a[i].resize(m + 5, 0);
        tplt[i].resize(m + 5, 0);
        vis[i].resize(m + 5, 0);

        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
        }
    }

    cin >> k;

    vector<pair<int, int>> pos;
    int x, y;
    while (k--) {
        cin >> x >> y;
        pos.emplace_back(x, y);
        tplt[x][y] = 2;
    }

    sort (pos.begin(), pos.end());

    int dx1[12] = {0, 0, -2, 2, -1, 0, 1, -1, 1, -1, 0, 1};
    int dy1[12] = {-2, 2, 0, 0, -1, -1, -1, 0, 0, 1, 1, 1};

    for (auto [u, v]:pos) {
        for (int j = 0; j < 12; j++) {
            int r = u + dx1[j], c = v + dy1[j];
            if (r >= 0 && r < n && c >= 0 && c < m && tplt[r][c] == 2) {
                adj[{u, v}].emplace_back(r, c);
                adj[{r, c}].emplace_back(u, v);
            }
        }
    }

    int ans = 0;

    for (auto [i, j]:pos) {
        if (!vis[i][j]) {
            sum1 = sum2 = cnt1 = cnt2 = 0;
            mi = 1e9 + 1;

            dfs(i, j);

            if (cnt1 < cnt2 * 3) return cout << "No", 0;
            else if (cnt1 == cnt2 * 3) ans += sum1 + sum2;
            else ans += sum1 + sum2 - mi;
        }
    }

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