제출 #1049714

#제출 시각아이디문제언어결과실행 시간메모리
1049714vjudge1T-Covering (eJOI19_covering)C++17
100 / 100
200 ms53456 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pi pair<int, int>
#define fi first
#define se second

const int N = 1e6 + 3;

int n, m, k, t, x, y, u, v;
ll ans = 0;
pi p[N];
vector<int> adj[N];
queue<pi> q;
priority_queue<int, vector<int>, greater<int> > pq;

int tx[4] = {0, 1, 0, -1}, ty[4] = {1, 0, -1, 0};

bool check (int u, int v) {
    return (0 <= u && u < n && 0 <= v && v < m);
}

pi toado (int k) {
    int x = k / m;
    int y = k % m;
    return {x, y};
}

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

    cin >> n >> m;
    vector<vector<int> > a(n + 1), d(n + 1);
    vector<vector<bool> > c(n + 1), vis(n + 1);

    for (int i = 0; i < n; ++ i) {
        a[i].resize(m + 1);
        d[i].resize(m + 1, 0);
        c[i].resize(m + 1, 0);
        vis[i].resize(m + 1, 0);
        for (int j = 0; j < m; ++ j) cin >> a[i][j];
    }

//    pi banh = toado(5);
//    cout << banh.fi << ' ' << banh.se << '\n';

    cin >> k;
    t = k;
    for (int i = 1; i <= k; ++ i) {
        cin >> p[i].fi >> p[i].se;
        tie(x, y) = p[i];
        c[x][y] = 1;
        d[x][y] ++;
        ans += a[x][y];
        int cnt = 0;
        for (int j = 0; j < 4; ++ j) {
            u = x + tx[j], v = y + ty[j];
            if (check(u, v))
                cnt ++,
                d[u][v] ++,
                ans += a[u][v],
                adj[x * m + y].push_back(u * m + v),
                adj[u * m + v].push_back(x * m + y);
        }

        if (cnt < 3) return cout << "No", 0;
    }

    for (int i = 0; i < n; ++ i) {
        for (int j = 0; j < m; ++ j) {
            if (c[i][j] && !vis[i][j]) {
                vis[i][j] = 1;
                q.push({i, j});
                int S = 0, SN = 0, SD = 0;
                while (!q.empty()) {
                    tie(x, y) = q.front();
                    int t = d[x][y] - 1;
                    ans -= (t * a[x][y]);
                    S -= t;
                    if (!c[x][y]) pq.push(a[x][y]), SD ++;
                    else {
                        S ++, SN ++;
                        if (x == 0 || x == n - 1 || y == 0 || y == m - 1) S --;
                    }
                    q.pop();

//                    if (x == 0 || x == n - 1 || y == 0 || y == m - 1) S --;

                    for (int z : adj[x * m + y]) {
                        pi banh = toado(z);
                        tie(u, v) = banh;
                        if (!vis[u][v]) {
                            vis[u][v] = 1;
                            q.push({u, v});
                        }
                    }
                }


//                cout << SN << ' ' << SD << ' ' << S << '\n';

                while (!pq.empty()) {
                    if (S > 0) S --, ans -= pq.top(), SD --;
                    pq.pop();
                }


                if (S != 0 || SD != 3 * SN) return cout << "No", 0;
            }
        }
    }

    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...