Submission #485508

#TimeUsernameProblemLanguageResultExecution timeMemory
485508sam571128Love Polygon (BOI18_polygon)C++17
46 / 100
714 ms24244 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]; vector<int> adj[N]; void dfs(int u){ assert(u <= N); assert(!visited[u]); sz[u] = 1; visited[u] = 1; for(auto v : adj[u]){ if(visited[v]) continue; dfs(v); sz[u] += sz[v]; } } 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; adj[x].push_back(y); adj[y].push_back(x); } if(n%2){ cout << -1 << "\n"; return 0; } if(n <= 20){ int dp[1<<n]; fill(dp,dp+(1<<n),1e18); dp[0] = 0; for(int mask = 0;mask < (1<<n); mask++){ for(int i = 0;i < n;i++){ if(mask&(1<<i)) continue; for(int j = 0;j < n;j++){ if(i==j||mask&(1<<j)) continue; dp[mask|(1<<i)|(1<<j)] = min(dp[mask]+(arr[i]!=j)+(arr[j]!=i),dp[mask|(1<<i)|(1<<j)]); } } } cout << dp[(1<<n)-1] << "\n"; }else{ int ans = 0; for(int i = 0;i < n;i++) ans += (arr[i] == i); for(int i = 0; i < n; i++){ if(!visited[i]){ dfs(i); if(sz[i]>2){ ans += sz[i]/2; if(sz[i]%2) ans++; } } } cout << max(ans,(int)0) << "\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...