#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<bool> vb;
typedef vector<vi> vvi;
const vi X8 = {1,1,1,0-1,-1,-1,0};
const vi Y8 = {-1,0,1,1,1,0-1,-1};
const vi X4 = {2,0,-2,0};
const vi Y4 = {0,2,0,-2};
int DFS1(vvi &nei, vb &vis, int v, int prev = -1){
    int g = 0;
    vis[v] = 1;
    for(int u : nei[v]){
        if(u == prev) continue;
        if(vis[u]){
            g++;
            continue;
        }
        g += DFS1(nei,vis,u,v);
    }
    return g;
}
pair<ll,int> DFS2(vvi &nei, vb &vis, vi &R, vi &C, vvi &B, int v){
    ll s = 0;
    int m = 1000;
    vis[v] = 1;
    pair<ll,int> t;
    vi O(4,2);
    for(int u : nei[v]){
        if(!vis[u]){
            t = DFS2(nei,vis,R,C,B,u);
            s += t.first;
            m = min(m,t.second);
        }
        if(R[v] == R[u]){
            if(C[u] == C[v] + 2) O[0] = 1;
            if(C[u] == C[v] + 1) O[0] = 0;
            if(C[u] == C[v] - 1) O[2] = 0;
            if(C[u] == C[v] - 2) O[2] = 0;
        }
        else if(C[v] == C[u]){
            if(R[u] == R[v] + 1) O[1] = 0;
            if(R[u] == R[v] + 2) O[1] = 1;
            if(R[u] == R[v] - 1) O[3] = 0;
            if(R[u] == R[v] - 2) O[3] = 0;
        }
        else{
            if(R[u] == R[v] + 1) O[1] = 1;
            else O[3] = 1;
            if(C[u] == C[v] + 1) O[0] = 0;
            else O[2] = 0;
        }
    }
    for(int i = 0;i < 4;i++){
        if(R[v] + Y4[i]/2 < 0 || R[v] + Y4[i]/2 >= B.size() || C[v] + X4[i]/2 < 0 || C[v] + X4[i]/2 >= B[0].size())
            continue;
        if(O[i] == 2){
            m = min(m,B[R[v] + Y4[i]/2][C[v] + X4[i]/2]);
        }
        if(O[i]){
            s += B[R[v] + Y4[i]/2][C[v] + X4[i]/2];
        }
    }
    return {s,m};
}
int Calc(int m, int n, vvi &B, int k, vi &R, vi &C){
    vvi P(m,vi(n,-1));
    for(int i = 0;i < k;i++) P[R[i]][C[i]] = i;
    ll ans = 0;
    vb vis(k+1,0), vis2 = vis;
    vis[k] = 1;
    vvi nei(k),nei2 = nei;
    for(int i = 0;i < k;i++){
        ans += B[R[i]][C[i]];
        for(int j = 0;j < 8;j++){
            if(R[i] + Y8[j] < 0 || R[i] + Y8[j] >= m) continue;
            if(C[i] + X8[j] < 0 || C[i] + X8[j] >= n) continue;
            if(P[R[i] + Y8[j]][C[i] + X8[j]] != -1){
                nei[i].push_back(P[R[i] + Y8[j]][C[i] + X8[j]]);
                nei2[i].push_back(P[R[i] + Y8[j]][C[i] + X8[j]]);
                if(j < 4) nei[i].push_back(k);
            }
        }
        for(int j = 0;j < 4;j++){
            if(R[i] + Y4[j] < 0 || R[i] + Y4[j] >= m) continue;
            if(C[i] + X4[j] < 0 || C[i] + X4[j] >= n) continue;
            if(P[R[i] + Y4[j]][C[i] + X4[j]] != -1){
                nei[i].push_back(P[R[i] + Y8[j]][C[i] + X8[j]]);
                nei2[i].push_back(P[R[i] + Y8[j]][C[i] + X8[j]]);
            }
        }
    }
    int g;
    pair<ll,int> pt;
    for(int i = 0;i < k;i++){
        if(vis[i]) continue;
        g = DFS1(nei,vis,i);
        if(g >= 2) return -1;
        pt = DFS2(nei2,vis2,R,C,B,i);
        ans += pt.first;
        if(g == 0) ans -= pt.second;
    }
    return ans;
}
int main(){
    int n,m;
    cin >> m >> n;
    vvi B(m,vi(n));
    for(int i = 0;i < m;i++) for(int j = 0;j < n;j++) cin >> B[i][j];
    int k;
    cin >> k;
    vi R(k),C(k);
    for(int i = 0;i < k;i++) cin >> R[i] >> C[i];
    cout << Calc(m,n,B,k,R,C);
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |