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...