Submission #485581

#TimeUsernameProblemLanguageResultExecution timeMemory
485581sam571128Love Polygon (BOI18_polygon)C++17
54 / 100
267 ms32196 KiB
#include <bits/stdc++.h> #define int long long #define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); using namespace std; const int N = 1e5+5; int visited[N], arr[N], sz[N], dp[N][2], col[N], ok[N], dp2[N][2], vis[N]; vector<int> adj[N]; void dfs(int u, int p, int no = -1){ visited[u] = 1; sz[u] = 1; int sum = 0, sum2 = 0; for(auto v : adj[u]){ if(v==p || visited[v] || (arr[u]==no&&v==no)) continue; dfs(v,u,no); sum += dp[v][0]; sum2 += dp2[v][0]; sz[u] += sz[v]; } int mx = 0, mx2 = 0; for(auto v : adj[u]){ if(v==p||(arr[u]==no&&v==no)) continue; mx = max(dp[v][1]-dp[v][0],mx); mx2 = max(dp2[v][1]-dp2[v][0],mx2); } dp[u][1] = sum+1; if(u!=no) dp2[u][1] = sum2+1; else dp2[u][1] = -1e18; dp[u][0] = mx+dp[u][1]-1; dp2[u][0] = max((int)0,mx2+dp2[u][1]-1); } int idx; map<string,int> m; int assign(string x){ if(m.find(x)==m.end()){ m[x] = idx++; } return m[x]; } signed main(){ fastio int n; cin >> n; for(int i = 0;i < n;i++){ string a,b; cin >> a >> b; int x = assign(a); int y = assign(b); arr[x] = y; if(x==y) continue; adj[x].push_back(y); adj[y].push_back(x); } if(n%2){ cout << -1 << "\n"; return 0; } for(int i = 0; i < n; i++){ if(arr[arr[i]]==i){ if(adj[arr[i]].size()==2){ ok[i] = 1; visited[arr[i]] = 1; }else{ ok[arr[i]] = 1; visited[i] = 1; } } } int ans = 0; for(int i = 0; i < n; i++){ if(arr[i]==i){ dfs(i,i); ans += sz[i]-dp[i][0]; } } for(int i = 0; i < n; i++){ if(!visited[i]){ if(ok[i]){ dfs(i,i); ans += sz[i]-dp[i][1]; }else{ int tmp = i; while(!vis[arr[tmp]]) tmp = arr[tmp], vis[arr[tmp]] = 1; dfs(tmp,tmp,arr[tmp]); ans += sz[tmp]-max(dp[tmp][0],dp2[tmp][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...