제출 #857826

#제출 시각아이디문제언어결과실행 시간메모리
857826vjudge1Skandi (COCI20_skandi)C++17
110 / 110
74 ms23820 KiB
#include <bits/stdc++.h>
using namespace std;

int32_t main() {
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        int n, m;
        cin >> n >> m;
        vector<vector<char>> a(n, vector<char>(m));
        for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                        cin >> a[i][j];
                }
        }

        vector<vector<int>> idx(n, vector<int>(m));
        vector<pair<int, int>> ridx(1);
        int N = 0;
        vector<vector<int>> adj(1);

        for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                        if (a[i][j] == '1') {
                                idx[i][j] = ++N;
                                ridx.emplace_back(i, j);
                                adj.emplace_back(vector<int>());
                        } else {
                                int p, q;
                                for (p = i; p >= 0; p--) {
                                        if (a[p][j] == '1') break;
                                }
                                for (q = j; q >= 0; q--) {
                                        if (a[i][q] == '1') break;
                                }
                                adj[idx[p][j]].emplace_back(idx[i][q]);
                        }
                }
        }

        vector<int> mat(N + 1), rmat(N + 1), dist(N + 1);

        auto bfs = [&]() {
                queue<int> q;
                dist[0] = 1e9;
                for (int i = 1; i <= N; i++) {
                        if (mat[i] == 0) {
                                q.emplace(i);
                                dist[i] = 0;
                        } else {
                                dist[i] = 1e9;
                        }
                }

                while (q.size()) {
                        int u = q.front();
                        q.pop();
                        if (dist[u] >= dist[0]) break;
                        for (int v : adj[u]) {
                                if (dist[rmat[v]] == 1e9) {
                                        dist[rmat[v]] = dist[u] + 1;
                                        q.emplace(rmat[v]);
                                }
                        }
                }

                return dist[0] != 1e9;
        };

        function<bool(int)> bpm = [&](int u) {
                if (!u) return true;

                for (int v : adj[u]) {
                        if (dist[rmat[v]] == dist[u] + 1) {
                                if (bpm(rmat[v])) {
                                        mat[u] = v;
                                        rmat[v] = u;
                                        return true;
                                }
                        }
                }

                dist[u] = 1e9;
                return false;
        };

        int res = 0;

        while (bfs()) {
                for (int i = 1; i <= N; i++) {
                        if (mat[i] == 0) {
                                res += bpm(i);
                        }
                }
        }

        vector<vector<vector<int>>> g(2, vector<vector<int>>(N + 1));
        // 0 left 1 right

        for (int i = 1; i <= N; i++) {
                for (int j : adj[i]) {
                        if (j != mat[i]) {
                                g[0][i].emplace_back(j);
                        } else {
                                g[1][j].emplace_back(i);
                        }
                }
        }
        vector<vector<int>> vis(2, vector<int>(N + 1));

        function<void(int, int)> dfs = [&](int _, int u) {
                vis[_][u] = 1;
                for (int v : g[_][u]) {
                        if (vis[_ ^ 1][v] == 0) {
                                dfs(_ ^ 1, v);
                        }
                }
        };

        for (int i = 1; i <= N; i++) {
                if (mat[i] == 0) dfs(0, i);
        }

        cout << res << '\n';

        for (int i = 1; i <= N; i++) {
                if (vis[0][i] == 0) {
                        cout << ridx[i].first + 1 << ' ' << ridx[i].second + 1 << " DOLJE\n";
                }
                if (vis[1][i] == 1) {
                        cout << ridx[i].first + 1 << ' ' << ridx[i].second + 1 << " DESNO\n";
                }
        }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...