Submission #439145

#TimeUsernameProblemLanguageResultExecution timeMemory
439145elazarkorenT-Covering (eJOI19_covering)C++17
0 / 100
3 ms332 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#define x first
#define y second
#define chkmin(a, b) a = min(a, b)
#define chkmax(a, b) a = max(a, b)
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pii;
typedef vector<pii> vii;

const ll infinity = 1e18;

int n, m;
set<pii> visited;

int ans = -1;

void Solve(int i, vii &special, vvi &board, int curr) {
    if (i == special.size()) {
        chkmax(ans, curr);
        return;
    }
    int x = special[i].x, y = special[i].y;
    if (visited.find({x, y}) != visited.end()) {
        return;
    }
    int sum = board[x][y], bad = 4;
    if (x && visited.find({x - 1, y}) == visited.end()) {
        sum += board[x - 1][y];
        bad--;
    }
    if (x < n - 1 && visited.find({x + 1, y}) == visited.end()) {
        sum += board[x + 1][y];
        bad--;
    }
    if (y && visited.find({x, y - 1}) == visited.end()) {
        sum += board[x][y - 1];
        bad--;
    }
    if (y < m - 1 && visited.find({x, y + 1}) == visited.end()) {
        sum += board[x][y + 1];
        bad--;
    }
    if (bad > 1) {
        return;
    }
    visited.insert({x, y});
    if (bad == 1) {
        auto it1 = visited.end();
        auto it2 = it1, it3 = it1, it4 = it1;
        if (x && visited.find({x - 1, y}) == visited.end()) {
            it1 = visited.insert({x - 1, y}).x;
        }
        if (x < n - 1 && visited.find({x + 1, y}) == visited.end()) {
            it2 = visited.insert({x + 1, y}).x;
        }
        if (y && visited.find({x, y - 1}) == visited.end()) {
            it3 = visited.insert({x, y - 1}).x;
        }
        if (y < m - 1 && visited.find({x, y + 1}) == visited.end()) {
            it4 = visited.insert({x, y + 1}).x;
        }
        Solve(i + 1, special, board, curr + sum);
        if (it1 != visited.end()) visited.erase(it1);
        if (it2 != visited.end()) visited.erase(it2);
        if (it3 != visited.end()) visited.erase(it3);
        if (it4 != visited.end()) visited.erase(it4);
        return;
    }
    auto it2 = visited.insert({x + 1, y}).x;
    auto it3 = visited.insert({x, y - 1}).x;
    auto it4 = visited.insert({x, y + 1}).x;
    Solve(i + 1, special, board, curr + sum - board[x - 1][y]);
    auto it1 = visited.insert({x - 1, y}).x;
    visited.erase(it2);
    Solve(i + 1, special, board, curr + sum - board[x + 1][y]);
    it2 = visited.insert({x + 1, y}).x;
    visited.erase(it3);
    Solve(i + 1, special, board, curr + sum - board[x][y - 1]);
    it3 = visited.insert({x, y - 1}).x;
    visited.erase(it4);
    Solve(i + 1, special, board, curr + sum - board[x][y + 1]);
    visited.erase(it1), visited.erase(it2), visited.erase(it3);
}

int main() {
    cin >> n >> m;
    vvi board(n, vi(m));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> board[i][j];
        }
    }
    int k;
    cin >> k;
    vii special(k);
    for (int i = 0; i < k; i++) {
        cin >> special[i].x >> special[i].y;
    }
    Solve(0, special, board, 0);
    if (ans == -1) cout << "No";
    else cout << ans;
}

Compilation message (stderr)

covering.cpp: In function 'void Solve(int, vii&, vvi&, int)':
covering.cpp:24:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 |     if (i == special.size()) {
      |         ~~^~~~~~~~~~~~~~~~~
#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...