제출 #456277

#제출 시각아이디문제언어결과실행 시간메모리
456277lukadupliT-Covering (eJOI19_covering)C++14
5 / 100
305 ms81196 KiB
#include <bits/stdc++.h>

#define f first
#define s second

using namespace std;

const int MAX = 1e6 + 5;

typedef pair <int, int> pii;

int n, m, k, sol;

vector <vector <int>> mat;
vector <vector <vector <int>>> occ;

pii specials[MAX];

set <int> ls[MAX];
bool bio[MAX];

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

int mini;
pii dfs(int node){
    bio[node] = 1;

    int tiles = 0, visited = 0;

    for(int j = 0; j < 4; j++){
        int nx = specials[node].f + dx[j], ny = specials[node].s + dy[j];

        if(nx >= 0 && nx < n && ny >= 0 && ny < m && mat[nx][ny] != -1){
            tiles++;
            mini = min(mini, mat[nx][ny]);

            mat[nx][ny] = -1;
        }
    }

    for(int i : ls[node]){
        if(!bio[i]){
            pii info = dfs(i);

            visited += info.f;
            tiles += info.s;
        }
    }

    return {visited + 1, tiles};
}

int main()
{
    cin >> n >> m;
    for(int i = 0; i < n; i++){
        mat.push_back({});
        occ.push_back({});
        for(int j = 0; j < m; j++){
            int e;
            cin >> e;
            mat[i].push_back(e);
            occ[i].push_back({});
        }
    }
    cin >> k;

    for(int i = 0; i < k; i++){
        int x, y;
        cin >> x >> y;

        specials[i] = {x, y};

        occ[x][y].push_back(i);
        for(int j = 0; j < 4; j++){
            int nx = x + dx[j], ny = y + dy[j];

            if(nx >= 0 && nx < n && ny >= 0 && ny < m) occ[nx][ny].push_back(i);
        }
    }

    int tile_cnt = 0;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(!occ[i][j].empty()){
                tile_cnt++;
                sol += mat[i][j];

                for(int a = 0; a < occ[i][j].size(); a++){
                    for(int b = a + 1; b < occ[i][j].size(); b++){
                        ls[occ[i][j][a]].insert(b);
                        ls[occ[i][j][b]].insert(a);
                    }
                }
            }
        }
    }
    if(tile_cnt < k * 4){
        cout << "No";
        exit(0);
    }

    //cout << sol << '\n';
    for(int i = 0; i < k; i++){
        if(bio[i]) continue;

        //cout << i << ": ";

        mini = 2e9;

        pii info = dfs(i);

        //cout << info.f << ' ' << info.s << '\n';
        if(info.s != info.f * 3){
            sol -= mini;
        }
    }

    cout << sol;

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

covering.cpp: In function 'int main()':
covering.cpp:90:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |                 for(int a = 0; a < occ[i][j].size(); a++){
      |                                ~~^~~~~~~~~~~~~~~~~~
covering.cpp:91:42: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |                     for(int b = a + 1; b < occ[i][j].size(); b++){
      |                                        ~~^~~~~~~~~~~~~~~~~~
#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...