Submission #227649

#TimeUsernameProblemLanguageResultExecution timeMemory
227649dvdg6566Dango Maker (JOI18_dango_maker)C++14
13 / 100
5 ms512 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<ll> vi; typedef pair<ll,ll> pi; typedef vector<pi> vpi; typedef long double ld; #define pb emplace_back #define mp make_pair #define lb lower_bound #define ub upper_bound #define ALL(x) x.begin(), x.end() #define SZ(x) (ll)x.size() #define f first #define s second const ll MAXN = 3010; const ll INF = 1e18; const ll MOD = 1e9+7; int N,M; string S; int G[MAXN][MAXN]; unordered_map<ll,ll> U; ll a; pi dp[MAXN]; vi V[MAXN]; void dfs(int x, int p){ pi out=mp(1,0); for (auto v:V[x])if(v!=p){ if(dp[v].f)assert(0); dfs(v,x); out.f+=dp[v].s; out.s+=max(dp[v].f,dp[v].s); } dp[x]=out; } int main(){ cin>>N>>M; for (int i=1;i<=N;++i){ cin>>S; for (int j=1;j<=N;++j){ if(S[j-1]=='R')G[i+1][j+1]=1; if(S[j-1]=='G')G[i+1][j+1]=2; if(S[j-1]=='W')G[i+1][j+1]=3; } } for (int i=2;i<=N+1;++i)for (int j=1;j<=M+1;++j){ if (G[i][j]!=2)continue; if ((G[i-1][j]==1&&G[i+1][j]==3)||(G[i][j-1]==1&&G[i][j+1]==3)){ // cout<<"Can "<<i<<' '<<j<<'\n'; U[i*MAXN+j]=++a; } } for (int i=2;i<=N+1;++i)for (int j=1;j<=M+1;++j){ if (G[i][j]!=1)continue; if(G[i+1][j]!=2||G[i+2][j]!=3)continue; if (G[i][j+1]!=2||G[i][j+2]!=3)continue; ll a = U[(i+1)*MAXN+j]; ll b = U[i*MAXN+j+1]; V[a].pb(b);V[b].pb(a); // cout<<"Edge "<<a<<' '<<b<<'\n'; } for (int i=2;i<=N+1;++i)for (int j=1;j<=M+1;++j){ if (G[i][j]!=3)continue; if(G[i-1][j]!=2||G[i-2][j]!=1)continue; if (G[i][j-1]!=2||G[i][j-2]!=1)continue; ll a = U[(i-1)*MAXN+j]; ll b = U[i*MAXN+j-1]; V[a].pb(b);V[b].pb(a); // cout<<"Edge "<<a<<' '<<b<<'\n'; } ll ans=0; for (int i=1;i<=a;++i)if(!dp[i].f){ dfs(i,-1); ans+=max(dp[i].f,dp[i].s); } cout<<ans<<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...