제출 #1289610

#제출 시각아이디문제언어결과실행 시간메모리
1289610dirtblockDango Maker (JOI18_dango_maker)C++20
13 / 100
1 ms1148 KiB
#include <bits/stdc++.h> #define int long long using namespace std; signed main() { std::ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n,m; cin>>n>>m; vector<string> s(n); for(int i=0; i<n; i++) cin>>s[i]; vector<int> idl(n*m,-1), idr(n*m,-1); int l=0,r=0; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(s[i][j]=='G') { if(j>0&&j<m-1&&s[i][j-1]=='R'&&s[i][j+1]=='W') idl[i*m+j]=l++; if(i>0&&i<n-1&&s[i-1][j]=='R'&&s[i+1][j]=='W') idr[i*m+j]=r++; } } } vector<int> h(l,-1),to,nxt; auto addEdge=[&](int u,int v) { nxt.push_back(h[u]); to.push_back(v); h[u]=(int)to.size()-1; }; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(s[i][j]=='G') continue; int lh=-1,rh=-1; if(s[i][j]=='R') { if(j<m-1) lh=idl[i*m+j+1]; if(i<n-1) rh=idr[(i+1)*m+j]; } else { if(j>0) lh=idl[i*m+j-1]; if(i>0) rh=idr[(i-1)*m+j]; } if(lh!=-1&&rh!=-1) addEdge(lh,rh); } } vector<int> uu(l,-1),vv(r,-1),dist(l); function<bool()> bfs=[&]() { queue<int>q; for(int u=0; u<l; u++) { if(uu[u]==-1) { dist[u]=0; q.push(u); } else dist[u]=-1; } bool r=false; while(!q.empty()) { int u=q.front(); q.pop(); for(int e=h[u]; e!=-1; e=nxt[e]) { int v=to[e]; if(vv[v]==-1) r=true; else if(dist[vv[v]]==-1) { dist[vv[v]]=dist[u]+1; q.push(vv[v]); } } } return r; }; function<bool(int)> dfs=[&](int u)->bool { for(int e=h[u]; e!=-1; e=nxt[e]) { int v=to[e]; if(vv[v]==-1||(dist[vv[v]]==dist[u]+1&&dfs(vv[v]))) { uu[u]=v; vv[v]=u; return true; } } dist[u]=INT_MAX; return false; }; int cnt=0; vector<int> temp=h; while(bfs()) { h=temp; for(int u=0; u<l; u++) { if(uu[u]==-1&&dfs(u)) cnt++; } } cout<<l+r-cnt; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...