답안 #282981

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
282981 2020-08-25T08:09:11 Z lani1akea T-Covering (eJOI19_covering) C++17
15 / 100
1000 ms 2560 KB
#include <bits/stdc++.h>

#define F first
#define S second
#define ll long long
#define pb push_back
#define endl '\n'

using namespace std;

const int MOD = 1e9+7;
const int N = 1e3;
int n, m, k, g[N][N], x[N * 1000], y[N * 1000], ans = -1;

void dfs(int nu, bool used[N][N], int p) {
    if (nu == k) {
        ans = max(ans, p);
        return;
    }
    if (used[x[nu]][y[nu]]) {
        return;
    }
    if (x[nu] < n - 1 and y[nu] < m - 1 and y[nu] and !used[x[nu]][y[nu]] and !used[x[nu]][y[nu] - 1] and !used[x[nu]][y[nu] + 1] and !used[x[nu] + 1][y[nu]]) { // down
        used[x[nu]][y[nu]] = used[x[nu]][y[nu] - 1] = used[x[nu]][y[nu] + 1] = used[x[nu] + 1][y[nu]] = 1;
        p += g[x[nu]][y[nu]];
        p += g[x[nu]][y[nu] - 1];
        p += g[x[nu]][y[nu] + 1];
        p += g[x[nu] + 1][y[nu]];
        dfs(nu + 1, used, p);
        used[x[nu]][y[nu]] = used[x[nu]][y[nu] - 1] = used[x[nu]][y[nu] + 1] = used[x[nu] + 1][y[nu]] = 0;
        p -= g[x[nu]][y[nu]];
        p -= g[x[nu]][y[nu] - 1];
        p -= g[x[nu]][y[nu] + 1];
        p -= g[x[nu] + 1][y[nu]];
    }
    if (x[nu] and y[nu] < m - 1 and y[nu] and !used[x[nu]][y[nu]] and !used[x[nu]][y[nu] - 1] and !used[x[nu]][y[nu] + 1] and !used[x[nu] - 1][y[nu]]) { // up
        used[x[nu]][y[nu]] = used[x[nu]][y[nu] - 1] = used[x[nu]][y[nu] + 1] = used[x[nu] - 1][y[nu]] = 1;
        p += g[x[nu]][y[nu]];
        p += g[x[nu]][y[nu] - 1];
        p += g[x[nu]][y[nu] + 1];
        p += g[x[nu] - 1][y[nu]];
        dfs(nu + 1, used, p);
        used[x[nu]][y[nu]] = used[x[nu]][y[nu] - 1] = used[x[nu]][y[nu] + 1] = used[x[nu] - 1][y[nu]] = 0;
        p -= g[x[nu]][y[nu]];
        p -= g[x[nu]][y[nu] - 1];
        p -= g[x[nu]][y[nu] + 1];
        p -= g[x[nu] - 1][y[nu]];
    }
    if (x[nu] < n - 1 and x[nu] and y[nu] and !used[x[nu]][y[nu]] and !used[x[nu]][y[nu] - 1] and !used[x[nu] + 1][y[nu]] and !used[x[nu] - 1][y[nu]]) { // left
        used[x[nu]][y[nu]] =  used[x[nu]][y[nu] - 1] =  used[x[nu] + 1][y[nu]] = used[x[nu] - 1][y[nu]] = 1;
        p += g[x[nu]][y[nu]];
        p += g[x[nu]][y[nu] - 1];
        p += g[x[nu] + 1][y[nu]];
        p += g[x[nu] - 1][y[nu]];
        dfs(nu + 1, used, p);
        used[x[nu]][y[nu]] =  used[x[nu]][y[nu] - 1] =  used[x[nu] + 1][y[nu]] = used[x[nu] - 1][y[nu]] = 0;
        p -= g[x[nu]][y[nu]];
        p -= g[x[nu]][y[nu] - 1];
        p -= g[x[nu] + 1][y[nu]];
        p -= g[x[nu] - 1][y[nu]];
    }
    if (x[nu] < n - 1 and x[nu] and y[nu] < m - 1 and !used[x[nu]][y[nu]] and !used[x[nu]][y[nu] + 1] and !used[x[nu] + 1][y[nu]] and !used[x[nu] - 1][y[nu]]) { // right
        used[x[nu]][y[nu]] =  used[x[nu]][y[nu] + 1] =  used[x[nu] + 1][y[nu]] = used[x[nu] - 1][y[nu]] = 1;
        p += g[x[nu]][y[nu]];
        p += g[x[nu]][y[nu] + 1];
        p += g[x[nu] + 1][y[nu]];
        p += g[x[nu] - 1][y[nu]];
        dfs(nu + 1, used, p);
        used[x[nu]][y[nu]] =  used[x[nu]][y[nu] + 1] =  used[x[nu] + 1][y[nu]] = used[x[nu] - 1][y[nu]] = 0;
        p -= g[x[nu]][y[nu]];
        p -= g[x[nu]][y[nu] + 1];
        p -= g[x[nu] + 1][y[nu]];
        p -= g[x[nu] - 1][y[nu]];
    }
    return;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> g[i][j];
        }
    }
    cin >> k;
    for (int i = 0; i < k; ++i) {
        cin >> x[i] >> y[i];
    }
    bool used[N][N];
    memset(used, 0, sizeof used);
    dfs(0,used,0);
    if (ans == -1)
        cout << "No\n";
    else
        cout << ans << endl;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 1664 KB Output is correct
2 Execution timed out 1088 ms 2560 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 1664 KB Output is correct
2 Execution timed out 1091 ms 2560 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 1664 KB Output is correct
2 Execution timed out 1087 ms 2432 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 1408 KB Output is correct
2 Execution timed out 1080 ms 1408 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1280 KB Output is correct
2 Correct 1 ms 1280 KB Output is correct
3 Correct 1 ms 1408 KB Output is correct
4 Correct 1 ms 1408 KB Output is correct
5 Correct 1 ms 1408 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 1664 KB Output is correct
2 Execution timed out 1088 ms 2560 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 1664 KB Output is correct
2 Execution timed out 1088 ms 2560 KB Time limit exceeded
3 Halted 0 ms 0 KB -