Submission #1272294

#TimeUsernameProblemLanguageResultExecution timeMemory
1272294altern23Logičari (COCI21_logicari)C++20
0 / 110
2 ms572 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pii pair<ll, ll> #define fi first #define sec second #define ld long double const int MAXN = 1e5; const ll INF = 1e18; const int MOD = 1e9 + 7; vector<ll> v, adj[MAXN + 5]; ll dp[MAXN + 5][4], dp2[MAXN + 5][4][4]; ll vis[MAXN + 5], is_cycle[MAXN + 5], p[MAXN + 5]; ll st, en; void dfs(ll idx, ll par){ vis[idx] = 1; for(auto i : adj[idx]){ if(i == par) continue; if(vis[i] == 1){ ll st = idx, en = i; for(;st != en;){ v.push_back(st); is_cycle[st] = 1; st = p[st]; } v.push_back(en); is_cycle[en] = 1; } else if(!vis[i]){ p[i] = idx; dfs(i, idx); } } vis[idx] = 2; } void dfs2(ll idx, ll par){ bool is_leaf = 1; for(auto i : adj[idx]){ if(i != par && !is_cycle[i]){ dfs2(i, idx); is_leaf = 0; for(int j = 0; j < 4; j++){ dp[idx][(j + 1) % 4] = min(dp[idx][(j + 1) % 4], dp[i][j] + ((j + 1) % 4 <= 1)); } } } if(is_leaf){ dp[idx][3] = 0, dp[idx][0] = 1; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int tc = 1; // cin >> tc; for(;tc--;){ ll N; cin >> N; for(int i = 1; i <= N; i++){ ll u, v; cin >> u >> v; adj[u].push_back(v), adj[v].push_back(u); } dfs(1, -1); for(int i = 1; i <= N; i++){ for(int j = 0; j < 4; j++){ dp[i][j] = 4LL * INF; } } for(int i = 1; i <= N; i++){ if(is_cycle[i]){ dfs2(i, -1); } } ll M = (int)v.size() - 1; for(int i = 0; i <= M; i++){ for(int j = 0; j < 4; j++){ for(int k = 0; k < 4; k++) dp2[i][j][k] = INF; } } for(int i = 0; i < 4; i++) dp2[0][i][i] = dp[v[0]][i]; for(int i = 1; i <= M; i++){ for(int j = 0; j < 4; j++){ // 0 -> biru belum ada pasangan // 1 -> biru sudah ada pasangan // 2 -> putih sudah ada pasangan // 3 -> putih belum ada pasangan dp2[i][j][0] = min({dp2[i][j][0], dp2[i - 1][j][3] + dp[v[i]][0]}); dp2[i][j][1] = min({dp2[i][j][1], dp2[i - 1][j][3] + dp[v[i]][1], dp2[i - 1][j][0] + dp[v[i]][0]}); dp2[i][j][2] = min({dp2[i][j][2], dp2[i - 1][j][2] + dp[v[i]][2], dp2[i - 1][j][1] + dp[v[i]][3]}); dp2[i][j][3] = min({dp2[i][j][3], dp2[i - 1][j][2] + dp[v[i]][3]}); } } ll ans = min({dp2[M][0][3], dp2[M][1][3], dp2[M][2][2], dp2[M][3][2], dp2[M][0][0], dp2[M][1][0]}); vector<ll> x; for(int i = 1; i <= M; i++) x.push_back(v[i]); x.push_back(v[0]); v.swap(x); for(int i = 0; i <= M; i++){ for(int j = 0; j < 4; j++){ for(int k = 0; k < 4; k++) dp2[i][j][k] = INF; } } for(int i = 0; i < 4; i++) dp2[0][i][i] = dp[v[0]][i]; for(int i = 1; i <= M; i++){ for(int j = 0; j < 4; j++){ // 0 -> biru belum ada pasangan // 1 -> biru sudah ada pasangan // 2 -> putih sudah ada pasangan // 3 -> putih belum ada pasangan dp2[i][j][0] = min({dp2[i][j][0], dp2[i - 1][j][3] + dp[v[i]][0]}); dp2[i][j][1] = min({dp2[i][j][1], dp2[i - 1][j][3] + dp[v[i]][1], dp2[i - 1][j][0] + dp[v[i]][0]}); dp2[i][j][2] = min({dp2[i][j][2], dp2[i - 1][j][2] + dp[v[i]][2], dp2[i - 1][j][1] + dp[v[i]][3]}); dp2[i][j][3] = min({dp2[i][j][3], dp2[i - 1][j][2] + dp[v[i]][3]}); } } // cout << dp2[M][3][1] << "\n"; ans = min({ans, dp2[M][0][3], dp2[M][1][3], dp2[M][2][2], dp2[M][3][2], dp2[M][0][0], dp2[M][1][0]}); if(ans >= INF) ans = -1; cout << ans << "\n"; } } /* */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...