Submission #541618

#TimeUsernameProblemLanguageResultExecution timeMemory
541618LoboLove Polygon (BOI18_polygon)C++17
54 / 100
161 ms30632 KiB
#include<bits/stdc++.h> using namespace std; const long long inf = (long long) 1e18 + 10; const int inf1 = (int) 1e9 + 10; #define int long long #define dbl long double #define endl '\n' #define sc second #define fr first #define mp make_pair #define pb push_back #define all(x) x.begin(), x.end() const int maxn = 1e5+10; int n, nx[maxn], mark[maxn], markc[maxn], dp[maxn][2]; string nxstring[maxn]; vector<int> ginv[maxn]; int dfscyc(int u) { if(markc[u]) return u; markc[u] = 1; return dfscyc(nx[u]); } void dfs(int u) { int mn = inf; mark[u] = 1; for(auto v : ginv[u]) { if(mark[v]) continue; dfs(v); dp[u][0]+= min(dp[v][1],dp[v][0]+1); mn = min(mn, dp[v][0] - min(dp[v][1],dp[v][0]+1)); } dp[u][1] = dp[u][0]+mn+1; // cout << u << " " << dp[u][0] << " " << dp[u][1] << endl; } void solve() { cin >> n; map<string,int> cc; for(int i = 1; i <= n; i++) { string s1,s2; cin >> s1 >> s2; cc[s1] = i; nxstring[i] = s2; } if(n%2 == 1) { cout << -1 << endl; return; } for(int i = 1; i <= n; i++) { nx[i] = cc[nxstring[i]]; // cout << i << " " << nx[i] << endl; ginv[nx[i]].pb(i); } int ans = 0; for(int i = 1; i <= n; i++) { if(mark[i]) continue; int rt = dfscyc(i); // cout << rt << " root " << endl; dfs(rt); if(nx[rt] != rt && nx[nx[rt]] == rt) ans+= 0; else ans+= min(dp[rt][1],dp[rt][0]+1); } cout << ans << endl; } int32_t main() { ios::sync_with_stdio(false); cin.tie(0); // freopen("in.in", "r", stdin); // freopen("out.out", "w", stdout); int tt = 1; // cin >> tt; while(tt--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...