Submission #718172

#TimeUsernameProblemLanguageResultExecution timeMemory
718172amirhoseinfar1385Love Polygon (BOI18_polygon)C++17
0 / 100
231 ms24588 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;
	}
	int res=n;
	set<pair<int,int>>st;
	for(int i=0;i<n;i++){
		st.insert(make_pair(cnt[i],i));
	}
	for(int i=0;i<n;i++){
		if(adj[adj[i]]==i){
			st.erase(make_pair(cnt[i],i));
			res--;
		}
	}
	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...