제출 #1014862

#제출 시각아이디문제언어결과실행 시간메모리
1014862ByeWorldDango Maker (JOI18_dango_maker)C++14
100 / 100
614 ms262144 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3", "unroll-loops") #define ll long long // #define int long long #define pb push_back #define fi first #define se second #define lf (id<<1) #define rg ((id<<1)|1) #define md ((l+r)>>1) #define ld long double using namespace std; typedef pair<int,int> pii; typedef pair<int, pii> ipii; const int MAXN = 3002; int n, m; char a[MAXN][MAXN]; int b[MAXN][MAXN], cnt; vector <vector<int>> adj; void add(int x, int y){ if(y!=0) adj[y].pb(x); } int day; vector <int> mat, vis; vector<bool> done; bool dfs(int nw){ if(vis[nw] == day) return 0; vis[nw] = day; for(auto nx : adj[nw]){ if(mat[nx]==0 || dfs(mat[nx])){ mat[nx] = nw; return 1; } } return 0; } signed main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin >> n >> m; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) cin >> a[i][j]; vector<int>te; adj.pb(te); int c1 = 0, c2 = 0; for(int i=1; i<=n; i++){ for(int j=1; j<=m-2; j++){ if(a[i][j]=='R' && a[i][j+1]=='G' && a[i][j+2]=='W'){ c1++; } } } for(int i=1; i<=n-2; i++){ for(int j=1; j<=m; j++){ if(a[i][j]=='R' && a[i+1][j]=='G' && a[i+2][j]=='W'){ c2++; } } } int num = 0; if(c1 < c2){ for(int i=1; i<=n; i++){ for(int j=1; j<=m-2; j++){ if(a[i][j]=='R' && a[i][j+1]=='G' && a[i][j+2]=='W'){ adj.pb(te); b[i][j] = ++cnt; b[i][j+1] = cnt; b[i][j+2] = cnt; } } } num = cnt; for(int i=1; i<=n-2; i++){ for(int j=1; j<=m; j++){ if(a[i][j]=='R' && a[i+1][j]=='G' && a[i+2][j]=='W'){ ++cnt; add(cnt, b[i][j]); add(cnt, b[i+1][j]); add(cnt, b[i+2][j]); } } } } else { for(int i=1; i<=n-2; i++){ for(int j=1; j<=m; j++){ if(a[i][j]=='R' && a[i+1][j]=='G' && a[i+2][j]=='W'){ adj.pb(te); ++cnt; b[i][j] = cnt; b[i+1][j] = cnt; b[i+2][j] = cnt; } } } num = cnt; for(int i=1; i<=n; i++){ for(int j=1; j<=m-2; j++){ if(a[i][j]=='R' && a[i][j+1]=='G' && a[i][j+2]=='W'){ ++cnt; add(cnt, b[i][j]); add(cnt, b[i][j+1]); add(cnt, b[i][j+2]); } } } } mat.resize(cnt+2); vis.resize(cnt+2); done.resize(cnt+2); int ANS = 0; for(int i=1; i<=num; i++){ for(auto nx : adj[i]){ if(mat[nx] == 0){ mat[nx] = i; done[i] = 1; ANS++; break; } } } for(int i=1; i<=num; i++){ if(done[i]) continue; day++; ANS += dfs(i); } cout << cnt-ANS << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...