Submission #220634

#TimeUsernameProblemLanguageResultExecution timeMemory
220634VimmerSkandi (COCI20_skandi)C++14
64 / 110
4787 ms10872 KiB
#include <bits/stdc++.h>

//#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize("-O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("fast-math")
//#pragma GCC optimize("no-stack-protector")

#define F first
#define S second
#define sz(x) int(x.size())
#define pb push_back
#define N 250005
#define MOD ll(998244353)

using namespace std;

typedef long long ll;

typedef long double ld;



int mt[N], idr[505][505];

vector <int> g[N];

bool mk[N];

bool kuna(int v)
{
    if (mk[v]) return 0;

    mk[v] = 1;

    for (auto it : g[v])
    {
        if (mt[it] == -1 || kuna(mt[it]))
            {
                mt[it] = v;

                return 1;
            }
    }

    return 0;
}
int main()
{
    ios_base::sync_with_stdio(0); istream::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int n, m;

    cin >> n >> m;

    string s[n];

    for (int i = 0; i < n; i++) cin >> s[i];

    if (n <= 10 && m <= 10)
    {
        vector <pair <int, int> > g; g.clear();

        for (int i = 0; i < n; i++)
          for (int j = 0; j < m; j++)
            if (s[i][j] == '1' && ((i + 1 != n && s[i + 1][j] == '0') || (j + 1 != m && s[i][j + 1] == '0'))) g.pb({i, j});

        int ans = 1e9;

        vector <pair <pair <int, int>, int> > gr; gr.clear();

        for (int umsk = 0; umsk < (1 << sz(g)); umsk++)
        {
            if (__builtin_popcount(umsk) >= ans) continue;

            vector <int> pr; pr.clear();

            for (int i = 0; i < sz(g); i++) if ((1 << i) & umsk) pr.pb(i);

            for (int msk = 0; msk < (1 << sz(pr)); msk++)
            {
                bool gd = 1;

                bool mk[n][m];

                for (int i = 0; i < n; i++)
                    for (int j = 0; j < m; j++) mk[i][j] = s[i][j] - '0';

                for (int i = 0; i < sz(pr); i++)
                    if ((1 << i) & msk)
                    {
                        int x = g[pr[i]].F, y = g[pr[i]].S;

                        if (y + 1 == m || s[x][y + 1] == '1') {gd = 0; break;}

                        int j = y + 1;

                        while (j < m && s[x][j] == '0') {mk[x][j] = 1; j++;}
                    }
                    else
                    {
                        int x = g[pr[i]].F, y = g[pr[i]].S;

                        if (x + 1 == n || s[x + 1][y] == '1') {gd = 0; break;}

                        int j = x + 1;

                        while (j < n && s[j][y] == '0') {mk[j][y] = 1; j++;}
                    }

                for (int i = 0; i < n; i++)
                    for (int j = 0; j < m; j++) if (!mk[i][j]) gd = 0;

                if (gd)
                {
                    ans = sz(pr);

                    gr.clear();

                    for (int i = 0; i < sz(pr); i++) gr.pb({{g[pr[i]].F, g[pr[i]].S}, (1 << i) & msk});

                    break;
                }
            }
        }

        cout << sz(gr) << endl;

        for (auto it : gr) cout << it.F.F + 1 << " " << it.F.S + 1 << " " << (it.S != 0 ? "DESNO" : "DOLJE") << endl;

        exit(0);
    }
    int id = 0;

    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++) idr[i][j] = id++;

    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
          if (s[i][j] == '0')
            {
                int x = i;

                while (s[x][j] == '0') x--;

                int y = j;

                while (s[i][y] == '0') y--;

                g[idr[x][j]].pb(idr[i][y]);
            }

    memset(mt, -1, sizeof(mt));

    for (int i = 0; i < N; i++)
    {
        if (sz(g[i]) == 0) continue;

        memset(mk, 0, sizeof(mk));

        kuna(i);
    }

    int ans = 0;

    for (int i = 0; i < N; i++) if (mt[i] != -1) ans++;

    cout << ans << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...