Submission #680346

# Submission time Handle Problem Language Result Execution time Memory
680346 2023-01-10T15:49:42 Z vjudge1 Dango Maker (JOI18_dango_maker) C++17
13 / 100
2000 ms 1116 KB
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define pb push_back
#define sz(x) (int)x.size()
#define getBit(x, i) ((x) >> (i) & 1)
#define rep(i, begin, end) for (ll i = (begin); i <= (end); i++)
#define rrep(i, begin, end) for (ll i = (begin); i >= (end); i--)

typedef long long ll;
typedef pair<int, int> ii;

template <class T>
bool minimize(T &a, const T &b) {
    if(a > b) {a = b; return 1;}
    return 0;
}
template <class T>
bool maximize(T &a, const T &b) {
    if(a < b) {a = b; return 1;}
    return 0;
}

const int N = 4e2 + 7, M = 20, oo = 2e9;

int n, m, s, t, res;
int tr[N], c[N][N], f[N][N];
bool st[N], en[N], mid[N], vis[N];
vector<int> adj[N];
string a[N];

bool bfs() {
    queue<int> q; q.push(s);
    memset(tr, 0, sizeof tr);
    memset(vis, 0, sizeof vis);
    tr[s] = -1; vis[s] = 1;
    while (!q.empty()) {
        int u = q.front(); q.pop();
        if (u == t) return 1;

        rep(v, 0, t) {
            if (!vis[v] && c[u][v] > f[u][v]) {
                tr[v] = u; vis[v] = 1;
                q.push(v);
            }
        }
    }
    return 0;
}

void incflow() {
    int v = t, dif = oo;
    for (; tr[v] != -1; v = tr[v]) {
        int u = tr[v];
        dif = min(dif, c[u][v] - f[u][v]);
    }

    v = t; res += dif;
    for (; tr[v] != -1; v = tr[v]) {
        int u = tr[v];
        f[u][v] += dif;
        f[v][u] -= dif;
    }
}

int g(int x, int y) {
    return (x - 1) * m + y;
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
//    freopen("test.inp", "r", stdin);
//    freopen("test.out", "w", stdout);
    cin >> n >> m;
    rep(i, 1, n) cin >> a[i], a[i] = ' ' + a[i];
    rep(i, 1, n) rep(j, 1, m) {
        // go right
        if (j + 2 <= m && a[i].substr(j, 3) == "RGW") {
            int fi = g(i, j), se = g(i, j + 1), th = g(i, j + 2);
            adj[fi].pb(se); adj[se].pb(th);

            c[fi][se] = c[se][fi] = 1;
            c[se][th] = c[th][se] = 1;

            st[fi] = en[th] = mid[se] = 1;
        }
        // go down
        if (i + 2 <= n && a[i][j] == 'R' && a[i + 1][j] == 'G' && a[i + 2][j] == 'W') {
            int fi = g(i, j), se = g(i + 1, j), th = g(i + 2, j);
            adj[fi].pb(se); adj[se].pb(th);

            c[fi][se] = c[se][fi] = 1;
            c[se][th] = c[th][se] = 1;

            st[fi] = en[th] = mid[se] = 1;
        }
    }

    t = n * m + 1;
    vector<int> node;
    rep(i, 1, n * m) {
        if (st[i]) {
            c[0][i] = c[i][0] = 1;
            adj[0].pb(i); adj[i].pb(0);
        }
        if (en[i]) {
            c[i][t] = c[t][i] = 1;
            adj[i].pb(t); adj[t].pb(i);
        }
        if (mid[i] && sz(adj[i]) == 2) node.pb(i);
    }

    int mx = 0;
    rep(i, 0, (1 << sz(node)) - 1) {
        memset(f, 0, sizeof f);
        rep(j, 0, sz(node) - 1) {
            int u = node[j], v = adj[u][getBit(i, j)];
            c[u][v] = c[v][u] = 0;
        }
        res = 0;
        while (bfs()) incflow();
        maximize(mx, res);

        rep(j, 0, sz(node) - 1) {
            int u = node[j], v = adj[u][getBit(i, j)];
            c[u][v] = c[v][u] = 1;
        }
    }
    cout << mx;
}

# Verdict Execution time Memory Grader output
1 Correct 1 ms 980 KB Output is correct
2 Correct 1 ms 980 KB Output is correct
3 Correct 1 ms 980 KB Output is correct
4 Correct 1 ms 980 KB Output is correct
5 Correct 1 ms 980 KB Output is correct
6 Correct 1 ms 980 KB Output is correct
7 Correct 1 ms 980 KB Output is correct
8 Correct 1 ms 988 KB Output is correct
9 Correct 1 ms 980 KB Output is correct
10 Correct 1 ms 980 KB Output is correct
11 Correct 1 ms 988 KB Output is correct
12 Correct 1 ms 980 KB Output is correct
13 Correct 1 ms 980 KB Output is correct
14 Correct 1 ms 980 KB Output is correct
15 Correct 1 ms 980 KB Output is correct
16 Correct 1 ms 980 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 980 KB Output is correct
2 Correct 1 ms 980 KB Output is correct
3 Correct 1 ms 980 KB Output is correct
4 Correct 1 ms 980 KB Output is correct
5 Correct 1 ms 980 KB Output is correct
6 Correct 1 ms 980 KB Output is correct
7 Correct 1 ms 980 KB Output is correct
8 Correct 1 ms 988 KB Output is correct
9 Correct 1 ms 980 KB Output is correct
10 Correct 1 ms 980 KB Output is correct
11 Correct 1 ms 988 KB Output is correct
12 Correct 1 ms 980 KB Output is correct
13 Correct 1 ms 980 KB Output is correct
14 Correct 1 ms 980 KB Output is correct
15 Correct 1 ms 980 KB Output is correct
16 Correct 1 ms 980 KB Output is correct
17 Correct 1 ms 992 KB Output is correct
18 Correct 1 ms 980 KB Output is correct
19 Correct 1 ms 1112 KB Output is correct
20 Correct 1 ms 1108 KB Output is correct
21 Correct 1 ms 1116 KB Output is correct
22 Correct 1 ms 1108 KB Output is correct
23 Correct 1 ms 980 KB Output is correct
24 Correct 1 ms 980 KB Output is correct
25 Correct 1 ms 988 KB Output is correct
26 Correct 1 ms 980 KB Output is correct
27 Execution timed out 2084 ms 1108 KB Time limit exceeded
28 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 980 KB Output is correct
2 Correct 1 ms 980 KB Output is correct
3 Correct 1 ms 980 KB Output is correct
4 Correct 1 ms 980 KB Output is correct
5 Correct 1 ms 980 KB Output is correct
6 Correct 1 ms 980 KB Output is correct
7 Correct 1 ms 980 KB Output is correct
8 Correct 1 ms 988 KB Output is correct
9 Correct 1 ms 980 KB Output is correct
10 Correct 1 ms 980 KB Output is correct
11 Correct 1 ms 988 KB Output is correct
12 Correct 1 ms 980 KB Output is correct
13 Correct 1 ms 980 KB Output is correct
14 Correct 1 ms 980 KB Output is correct
15 Correct 1 ms 980 KB Output is correct
16 Correct 1 ms 980 KB Output is correct
17 Correct 1 ms 992 KB Output is correct
18 Correct 1 ms 980 KB Output is correct
19 Correct 1 ms 1112 KB Output is correct
20 Correct 1 ms 1108 KB Output is correct
21 Correct 1 ms 1116 KB Output is correct
22 Correct 1 ms 1108 KB Output is correct
23 Correct 1 ms 980 KB Output is correct
24 Correct 1 ms 980 KB Output is correct
25 Correct 1 ms 988 KB Output is correct
26 Correct 1 ms 980 KB Output is correct
27 Execution timed out 2084 ms 1108 KB Time limit exceeded
28 Halted 0 ms 0 KB -