이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<bool> vb;
typedef vector<vb> vvb;
pair<int,int> pom[4] = {{0,1}, {0,-1}, {1, 0}, {-1, 0}};
pair<int,int> pom2[8] = {{1,1}, {1,-1}, {-1, 1}, {-1, -1}, {0,2}, {0,-2}, {2, 0}, {-2, 0}};
pair<int,int> pom3[4] = {{0,2}, {0,-2}, {2, 0}, {-2, 0}};
bool edge(int r, int c, int n, int m){
    return (r==0 || r==n-1 || c==0 || c==m-1);
}
int getSum(int i, int n, int m, vvi& grid, vi& row, vi& col, vvb& taken){
    int res = grid[row[i]][col[i]];
    for(int p=0; p<4; p++){
        int r = row[i] + pom[p].first, 
            c = col[i] + pom[p].second; 
        if(r<0 || r>=n || c<0 || c>=m) continue;
        if(!taken[r][c])
            res += grid[r][c];
        taken[r][c] = true;
    }
    return res;
}
int getSumCount(int i, int n, int m, vvi& grid, vi& row, vi& col, vvb& taken, int& cnt, int& mr, int& mc){
    int res = grid[row[i]][col[i]];
    for(int p=0; p<4; p++){
        int r = row[i] + pom[p].first, 
            c = col[i] + pom[p].second; 
        if(r<0 || r>=n || c<0 || c>=m) continue;
        if(!taken[r][c]){
            res += grid[r][c];
            taken[r][c] = true;
            cnt++;
            if(mr == -1 || grid[r][c] < grid[mr][mc]){
                mr = r; mc = c;
            }
        }
    }
    return res;
}
int solve(int n, int m, vvi& grid, int k, vi& row, vi& col, vvi& cellidx){
    int res = 0;
    vb solved(k, false);
    vvb taken(n, vb(m, false));
    for(int i=0; i<k; i++)
        taken[row[i]][col[i]] = true;
    
    for(int i=0; i<k; i++){
        if(!solved[i]){
            bool foundPair = false;
            for(int r=-1; r<=1; r++){
                for(int c=-1; c<=1; c++){
                    if(row[i]+r<0 || row[i]+r>=n || col[i]+c<0 || col[i]+c>=m)
                        continue;
                    if(r == 0 && c == 0) 
                        continue;
                    int ci = cellidx[row[i]+r][col[i]+c];
                    if(ci == -1)
                        continue;
                    if(solved[ci] || foundPair)
                        return -1;
                    if(edge(row[i], col[i], n, m) || edge(row[ci], col[ci], n, m))
                        return -1;
                    solved[i] = solved[ci] = true;
                    res += getSum(i, n, m, grid, row, col, taken);
                    res += getSum(ci, n, m, grid, row, col, taken);
                    foundPair = true;
                }
            }
        } 
    }
    stack<int> st;
    for(int i=0; i<k; i++){
        if(!solved[i]){
            int t = 0;
            for(int p=0; p<4; p++){
                int r = row[i] + pom[p].first, 
                    c = col[i] + pom[p].second; 
                if(r<0 || r>=n || c<0 || c>=m || taken[r][c]) t++;
            }
            if(t > 1) return -1;
            if(t == 1) st.push(i);
        }
    }
    while(!st.empty()){
        int i = st.top();
        st.pop();
        if(solved[i]) continue;
        solved[i] = true;
        res += grid[row[i]][col[i]];
        int t = 0;
        for(int p=0; p<4; p++){
            int r = row[i] + pom[p].first, 
                c = col[i] + pom[p].second; 
            if(r<0 || r>=n || c<0 || c>=m) {
                t++;
                continue;
            }
            if(taken[r][c]) t++;
            else {
                taken[r][c] = true;
                res += grid[r][c];
            }
        }
        if(t > 1) return -1;
        for(int p=0; p<8; p++){
            int r = row[i] + pom2[p].first, 
                c = col[i] + pom2[p].second; 
            if(r<0 || r>=n || c<0 || c>=m) continue;
            int ci = cellidx[r][c];
            if(ci != -1) st.push(ci);
        }
    }
    for(int i=0; i<k; i++){
        if(!solved[i]){
            vector<int> cmp;
            queue<int> q;
            q.push(i);
            while(!q.empty()){
                int v = q.front();
                q.pop();
                if(solved[v]) continue;
                solved[v] = true;
                cmp.push_back(v);
                for(int p=0; p<4; p++){
                    int r = row[i] + pom3[p].first,
                        c = col[i] + pom3[p].second;
                    if(r<0 || r>=n || c<0 || c>=m) continue;
                    int ci = cellidx[r][c];
                    if(ci != -1) q.push(ci);
                }
            }
            int cnt = 0, mr = -1, mc = -1;
            for(int j : cmp)
                res += getSumCount(j, n, m, grid, row, col, taken, cnt, mr, mc);
            if(cnt > 3*cmp.size()){
                assert(mr != -1);
                res -= grid[mr][mc];
                taken[mr][mc] = false;
            } else if(cnt < 3*cmp.size())
                return -1;
        }
    }
    return res;
}
int main()
{
    int n, m;
    cin >> n >> m;
    vvi grid(n, vi(m));
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            cin >> grid[i][j];
    int k;
    cin >> k;
    vi row(k), col(k);
    vvi cellidx(n, vi(m, -1));
    for(int i=0; i<k; i++){
        cin >> row[i] >> col[i];
        cellidx[row[i]][col[i]] = i;
    }
    int res = solve(n, m, grid, k, row, col, cellidx);
    if(res == -1) cout << "No\n";
    else cout << res << '\n';
    return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
covering.cpp: In function 'int solve(int, int, vvi&, int, vi&, vi&, vvi&)':
covering.cpp:148:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  148 |             if(cnt > 3*cmp.size()){
      |                ~~~~^~~~~~~~~~~~~~
covering.cpp:152:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  152 |             } else if(cnt < 3*cmp.size())
      |                       ~~~~^~~~~~~~~~~~~~| # | 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... |