제출 #641087

#제출 시각아이디문제언어결과실행 시간메모리
641087LeonaRagingT-Covering (eJOI19_covering)C++14
15 / 100
218 ms16296 KiB
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define ll long long
#define pb push_back
#define db(val) "[" #val " = " << (val) << "] "

const ll mod = 1e9 + 7;
const int maxn = 1e5 + 4;
const int INF = 1e9;

int r, c;
int dx[] = {-1, 1, 0, 0};
int dy[] = { 0, 0,-1, 1};
vector<vector<int>> a, dp[2], col;
queue<pair<int,int>> q;

bool ok(int i, int j) {
    return i >= 1 && i <= r && j >= 1 && j <= c;
}

void place(int i, int j, int k) {
    // clog << i << ' ' << j << ' ' << k << '\n';
    for (int p = 0; p < 4; p++)
        if (p != k) {
            int x = i + dx[p], y = j + dy[p];
            if (!ok(x, y) || col[x][y])
                cout << "NO", exit(0);
            q.push({x, y});
            col[x][y] = 2;
        }
    col[i][j] = 2;
}

void bfs() {
    while (!q.empty()) {
        int i, j; tie(i, j) = q.front(); q.pop();
        for (int p = 0; p < 4; p++) {
            int x = i + dx[p], y = j + dy[p];
            if (ok(x, y) && abs(col[x][y]) == 1) {
                if (x == 4 && y == 5) clog << "ok";
                place(x, y, p ^ 1);
                col[x][y] = 2;
            }
        }
    }
}

void dfs(int i, int j, int k) {
    col[i][j] = -1;
    dp[0][i][j] = dp[1][i][j] = -INF;
    for (int p = 0; p < 4; p++) if (k != p) {
        int x = i + 2 * dx[p], y = j + 2 * dy[p];
        if (!ok(x, y)) continue;
        if (col[x][y] == -1) {
            place(i, j, p), bfs();
            return;
        }
        else if (col[x][y] == 1)
            dfs(x, y, p ^ 1);
    }
    for (int p = 0; p < 4; p++) {
        int res = a[i][j];
        for (int d = 0; d < 4; d++) {
            int x = i + 2 * dx[d], y = j + 2 * dy[d];
            if (d == p) {
                if (ok(x, y) && p != k)
                    res += max(dp[0][x][y], dp[1][x][y]);
            }
            else {
                res += a[i + dx[d]][j + dy[d]];
                if (ok(x, y) && p != k)
                    res += dp[0][x][y];
            }
        }
        dp[p != k][i][j] = max(dp[p != k][i][j], res);
    }
}

int main()
{
    // ios::sync_with_stdio(0);
    // cin.tie(0); cout.tie(0);
    //freopen(".INP", "r", stdin);
    //freopen(".OUT", "w", stdout);
    cin >> r >> c;
    a.resize(r + 4);
    for (int i = 0; i < r + 4; i++)
        a[i].resize(c + 4);
    dp[0] = dp[1] = col = a;
    for (int i = 1; i <= r; i++)
        for (int j = 1; j <= c; j++)
            cin >> a[i][j];
    int k; cin >> k;
    for (int i = 1; i <= k; i++) {
        int x, y; cin >> x >> y;
        x++, y++;
        col[x][y] = 1;
        q.push({x, y});
    }   
    for (int i = 1; i <= r; i++)
        q.push({i, 0}), q.push({i, c + 1});
    for (int j = 1; j <= c; j++) {
        q.push({0, j}), q.push({r + 1, j});
    }
    bfs();
    for (int i = 1; i <= r; i++)
        for (int j = 1; j <= c; j++) if (col[i][j] == 1) {
            if (i > 1 && j > 1 && col[i - 1][j - 1] == 1) {
                place(i, j, 0), bfs();
            }
            if (i > 1 && j < c && col[i - 1][j + 1] == 1)
                place(i, j, 0), bfs();
        }
    int res = 0;
    for (int i = 1; i <= r; i++)
        for (int j = 1; j <= c; j++) if (col[i][j] == 1) {
            dfs(i, j, -1);
            if (col[i][j] == -1)
                res += dp[1][i][j];
        }
    for (int i = 1; i <= r; i++)
        for (int j = 1; j <= c; j++)
            if (col[i][j] == 2)
                res += a[i][j];
    cout << res;
    // for (int i = 1; i <= r; i++)
        // for (int j = 1; j <= c; j++)
            // cout << col[i][j] << (j == c ? '\n' : ' ');
}
#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...