Submission #976350

#TimeUsernameProblemLanguageResultExecution timeMemory
976350Error404Love Polygon (BOI18_polygon)C++17
100 / 100
299 ms29388 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define f first #define s second #define pi pair<int,int> const int MAX = 2e5; int n; map<string,int>m; vector<int>g[MAX]; int love[MAX]; int indegree[MAX]; int visited[MAX]; map<int,string>name; int main(){ int n; cin>> n; string from, to; int k = 1; if(n%2){ cout << -1 << endl; return 0; } int a,b; for(int i = 0; i < n; i++){ cin >> from >> to; if(m[from]==0) { // cout << from << " " << k << endl; name[k]=from; m[from]=k++; } if(m[to]==0){ // cout << to << " " << k << endl; name[k]=to; m[to]=k++; } a = m[from], b= m[to]; love[a]=b; if(love[b]==a && a!=b){ visited[a]= visited[b]=1; } else{ g[a].pb(b); indegree[b]++; } } priority_queue<pi,vector<pi>, greater<pi>>q; for(int i = 1; i <= n; i++){ if(indegree[i]==0 && visited[i]==0){ q.push({0,i}); } } ll ans = 0; while(!q.empty()){ int from = q.top().s; q.pop(); //cout << name[from] << " " << ans<< endl; for(int to : g[from]){ indegree[to]--; if(!visited[to]&&!visited[from]){ if(visited[from])continue; q.push({indegree[to],to}); ans++; visited[from]= visited[to] =1; } else if(indegree[to]==0 && !visited[to]){ q.push({0,to}); } } } // ans /=2; ll comp= 0; for(int i = 1; i <= n; i++){ if(!visited[i] &&!visited[love[i]]&& love[i]!=i && love[i]!=0) { comp = 0; while(!visited[i]){ visited[i]=1; i =love[i]; comp++; } ans += (comp+1)/2; } } for(int i = 1; i <= n; i++){ if(!visited[i]) { ans++; } } cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...