Submission #930090

#TimeUsernameProblemLanguageResultExecution timeMemory
930090KarootLove Polygon (BOI18_polygon)C++17
100 / 100
249 ms20272 KiB
#include <iostream> #include <cmath> #include <unordered_map> #include <map> #include <set> #include <queue> #include <vector> #include <string> #include <iomanip> #include <algorithm> #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() using namespace std; typedef long long ll; ll linf = 1e15+1; inline void scoobydoobydoo(){ ios::sync_with_stdio(false); ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } const int MAXN = 2e5+1; int indeg[MAXN]; int parent[MAXN]; bool don[MAXN]; int counter = 0; map<int, string> M; map<string, int> person; vector<int> single; vector<int> ans; int main(){ scoobydoobydoo(); int n; cin >> n; for (int i = 0; i < n; i++){ string a, b; cin >> a >> b; if (person.find(a) == person.end()){ person[a] = counter++; M[person[a]] = a; } if (person.find(b) == person.end()){ person[b] = counter++; M[person[b]] = b; } parent[person[a]] = person[b]; } if (n%2){ cout << -1 << endl; return 0; } //filter relationships for (int i = 0; i < counter; i++){ if (!don[i] && parent[parent[i]] == i && parent[i] != i){ don[i] = true; don[parent[i]] = true; } } for (int i = 0; i < counter; i++){ if (don[i])continue; if (don[parent[i]] || parent[i] == i)parent[i] = -1; else indeg[parent[i]]++; } queue<int> q; for (int i = 0; i < counter; i++){ if (don[i])continue; if (parent[i] == -1 && indeg[i] == 0)single.push_back(i); else if (indeg[i] == 0)q.push(i); } while (!q.empty()){ int node = q.front(); int pare = parent[node]; q.pop(); if (don[pare]){ single.push_back(node); don[node] = true; continue; } ans.push_back(pare); indeg[parent[pare]]--; don[node] = true; don[pare] = true; if (parent[parent[pare]] == -1 && indeg[parent[pare]] == 0)single.push_back(parent[pare]); else if (indeg[parent[pare]] == 0)q.push(parent[pare]); } //cout << (int)ans.size() << endl; //cout << single.size() << endl; for (int i = 0; i < counter; i++){ if (!don[i] && indeg[i] == 1 && parent[i] != -1){ don[i] = true; //cout << "inhere: " << i << endl; if (don[parent[i]]){ don[i] = true; single.push_back(i); continue; } don[parent[i]] = true; indeg[parent[parent[i]]]--; ans.push_back(parent[i]); if (indeg[parent[parent[i]]] == 0)q.push(parent[parent[i]]); while (!q.empty()){ int node = q.front(); int pare = parent[node]; q.pop(); if (don[node])continue; if (don[pare]){ single.push_back(node); don[node] = true; continue; } ans.push_back(pare); indeg[parent[pare]]--; don[node] = true; don[pare] = true; if ((parent[parent[pare]] == -1 || don[parent[parent[pare]]]) && indeg[parent[pare]] == 0 && !don[parent[pare]] && parent[parent[pare]] != i)single.push_back(parent[pare]); else if (indeg[parent[pare]] == 0)q.push(parent[pare]); } } } /* 10 a a b c c d d e e f f b g c h g i c j g */ //pair singles /*cout << "ordinary" << endl; for (auto& e : ans)cout << e << " "; cout << endl; cout << "singles" << endl;*/ for (int i = 0; i < single.size(); i++){ ans.push_back(single[i]); //cout << single[i] << " "; } //cout << endl; cout << ans.size() << endl; return 0; }

Compilation message (stderr)

polygon.cpp: In function 'int main()':
polygon.cpp:165:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  165 |     for (int i = 0; i < single.size(); i++){
      |                     ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...