제출 #220634

#제출 시각아이디문제언어결과실행 시간메모리
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...