Submission #1248346

#TimeUsernameProblemLanguageResultExecution timeMemory
1248346andrei_nGame (eJOI20_game)C++20
100 / 100
1 ms468 KiB
#include <bits/stdc++.h> #ifdef LOCAL #include <debug.h> #else #define debug #endif // LOCAL using namespace std; const int INF = 999999; vector<int> v[500]; vector<int> lant; vector<int> ciclu; vector<int> mic; int vis[500]; int cnt, out; vector<vector<vector<int>>> dp; void dfs(int node) { // debug("%, ", node); if(node == 0) { out = 1; return; } ++cnt; vis[node] = 1; for(auto &oth : v[node]) if(!vis[oth]) dfs(oth); } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m; cin>>n>>m; char ch; for(int i=1; i<=n+1; ++i) for(int j=1; j<=m; ++j) { cin>>ch; if(ch == '0') { int a = (i-1)*(m+1)+j; int b = i*(m+1)+j; if(i == 1) a = 0; if(i == n+1) b = 0; v[a].push_back(b); v[b].push_back(a); } } for(int i=1; i<=n; ++i) for(int j=1; j<=m+1; ++j) { cin>>ch; if(ch == '0') { int a = i*(m+1)+j-1; int b = i*(m+1)+j; if(j == 1) a = 0; if(j == m+1) b = 0; v[a].push_back(b); v[b].push_back(a); } } mic.push_back(INF); lant.push_back(INF); ciclu.push_back(INF); for(int i=1; i<=n; ++i) for(int j=1; j<=m; ++j) { if(vis[i*(m+1)+j]) continue; cnt = out = 0; dfs(i*(m+1)+j); // debug("\n"); if(cnt == 1 && !out) continue; if(cnt == 1) mic.push_back(1); else if(cnt == 2) mic.push_back(2); else if(out) lant.push_back(cnt); else ciclu.push_back(cnt); } sort(mic.begin(), mic.end(), greater<int>()); sort(lant.begin(), lant.end(), greater<int>()); sort(ciclu.begin(), ciclu.end(), greater<int>()); int A = mic.size()-1, B = lant.size()-1, C = ciclu.size()-1; // debug("mic = %\nlant = %\nciclu = %\n", mic, lant, ciclu); dp.assign(A+5, vector<vector<int>>(B+5, vector<int>(C+5, -INF))); for(int a=0; a<=A; ++a) for(int b=0; b<=B; ++b) for(int c=0; c<=C; ++c) { if(!a && !b && !c) dp[a][b][c] = 0; int oth; if(a) //mic { oth = dp[a-1][b][c] + mic[a]; dp[a][b][c] = max(dp[a][b][c], -oth); } if(b) //lant { oth = max(dp[a][b-1][c] + lant[b], - dp[a][b-1][c] + lant[b] - 4); dp[a][b][c] = max(dp[a][b][c], -oth); } if(c) //ciclu { oth = max(dp[a][b][c-1] + ciclu[c], - dp[a][b][c-1] + ciclu[c] - 8); dp[a][b][c] = max(dp[a][b][c], -oth); } } cout<<dp[A][B][C]; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...