Submission #718171

#TimeUsernameProblemLanguageResultExecution timeMemory
718171amirhoseinfar1385Love Polygon (BOI18_polygon)C++17
75 / 100
277 ms27196 KiB
#include<bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin>>n; map<string,int>mp; vector<int>cnt(n+1); vector<vector<int>>revadj(n+1); vector<pair<string,string>>all(n); for(int i=0;i<n;i++){ cin>>all[i].first>>all[i].second; mp[all[i].first]=i; } vector<int>adj(n+1); for(int i=0;i<n;i++){ int x=mp[all[i].second]; revadj[x].push_back(i); adj[i]=x; cnt[x]++; } if(n&1){ cout<<-1<<"\n"; return 0; } if(n<=20){ int res=n; for(int i=0;i<(1<<n);i++){ int f=1,cnt=0; vector<int>cnta(n+1); for(int j=0;j<n;j++){ if((i>>j)&1){ continue; } if((i>>(adj[j]))&1){ cnt++; cnta[adj[j]]++; if(cnta[adj[j]]>1){ f=0; } continue; } if(adj[adj[j]]!=j||adj[j]==j){ f=0; } } if(f&&cnt<=__builtin_popcount(i)){ //cout<<i<<" "<<cnt<<" "<<f<<'\n'; res=min(res,__builtin_popcount(i)); } } cout<<res<<"\n"; return 0; } int res=n; set<pair<int,int>>st; for(int i=0;i<n;i++){ st.insert(make_pair(cnt[i],i)); } while((int)st.size()>0){ auto x=*st.begin(); if(x.first>=1){ vector<int>vis(n+2); for(int i=0;i<n;i++){ if(st.count(make_pair(cnt[i],i))==0){ vis[i]=1; } } for(int i=0;i<n;i++){ if(vis[i]==0){ int cnta=0; int fi=i; while(vis[fi]==0){ vis[fi]=1; cnta++; // cout<<fi<<" "<<adj[fi]<<'\n'; fi=adj[fi]; } if(cnta==2){ res-=cnta; continue; } //cout<<i<<" "<<cnt<<"\n"; res-=(cnta)/2; } } break; } st.erase(x); //cout<<x.second<<" "<<adj[x.second]<<'\n'; if(adj[x.second]==x.second){ continue; } res--; for(auto y:revadj[x.second]){ st.erase(make_pair(cnt[y],y)); } // cout<<x.second<<'\n'; st.erase(make_pair(cnt[adj[x.second]],adj[x.second])); if(st.count(make_pair(cnt[adj[adj[x.second]]],adj[adj[x.second]]))==1){ st.erase(make_pair(cnt[adj[adj[x.second]]],adj[adj[x.second]])); cnt[adj[adj[x.second]]]--; st.insert(make_pair(cnt[adj[adj[x.second]]],adj[adj[x.second]])); } for(auto y:revadj[adj[x.second]]){ st.erase(make_pair(cnt[y],y)); } } cout<<res<<'\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...