#include <bits/stdc++.h>
using namespace std;
#define int long long
bool edge(int x, int y, int a, int b){
if (a == x-1 && b == y-1) return true;
else if (a == x+1 && b == y+1) return true;
else if (a == x-1 && b == y) return true;
else if (a == x && b == y-1) return true;
else if (a == x+1 && b == y) return true;
else if (a == x && b == y+1) return true;
else if (a == x && b == y+2) return true;
else if (a == x && b == y-2) return true;
else if (a == x-2 && b == y) return true;
else if (a == x+2 && b == y) return true;
return false;
}
void solve(){
int n, m; cin >> n >> m;
vector<vector<int>> els(n, vector<int>(m));
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
cin >> els[i][j];
}
}
int k; cin >> k;
vector<pair<int, int>> xs;
vector<bool> vis(k, false);
for (int i = 0; i < k; i ++){
int x, y; cin >> x >> y;
xs.push_back({x, y});
}
int ans = 0;
auto bfs = [&](int p) -> void {
set<vector<int>> sosedi;
int cnt = 0;
queue<int> q;
q.push(p);
int sz = 0;
int mn = 1e9;
while (!q.empty()){
sz++;
int p = q.front();
vis[p] = true;
q.pop();
int x = xs[p].first, y = xs[p].second;
if (sosedi.find({x, y}) == sosedi.end()) cnt+=els[x][y];
sosedi.insert({x, y});
if (x-1 >= 0 && sosedi.find({x-1, y}) == sosedi.end()) {
sosedi.insert({x-1, y});
cnt += els[x-1][y];
mn = min(mn, els[x-1][y]);
}
if (x+1 < n && sosedi.find({x+1, y}) == sosedi.end()) {
sosedi.insert({x+1, y});
cnt += els[x+1][y];
mn = min(mn, els[x+1][y]);
}
if (y-1 >= 0 && sosedi.find({x, y-1}) == sosedi.end()) {
sosedi.insert({x, y-1});
cnt += els[x][y-1];
mn = min(mn, els[x][y-1]);
}
if (y+1 < m && sosedi.find({x, y+1}) == sosedi.end()) {
sosedi.insert({x, y+1});
cnt += els[x][y+1];
mn = min(mn, els[x][y+1]);
}
for (int ch = 0; ch < k; ch ++) {
if (p == ch) continue;
int a = xs[ch].first, b = xs[ch].second;
if (edge(x, y, a, b) && !vis[ch]) q.push(ch);
}
}
// cout << sosedi.size() << ' ' << sz << ' ' << cnt << endl;
if (sosedi.size() - sz < 3*sz) {cout << "No" << endl; exit(0);}
if (sosedi.size() - sz == 3*sz) ans += cnt;
if (sosedi.size() - sz == 3*sz + 1) ans += cnt - mn;
return;
};
for (int i = 0; i < k; i++){
int x = xs[i].first, y = xs[i].second;
if (!vis[i]){
bfs(i);
// cout << 1<< endl;
}
}
cout << ans << endl;
}
signed main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int t = 1;
// cin >> t;
while (t--)solve();
}
Compilation message (stderr)
covering.cpp: In function 'int main()':
covering.cpp:112:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
112 | freopen("input.txt", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
covering.cpp:113:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
113 | freopen("output.txt", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |