Advertisement
erek1e

BIO 2018 Round 2 Problem 3 - Détente

Feb 14th, 2021
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.33 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4.  
  5. using namespace std;
  6.  
  7. const int MAX_V = 1 << 16;
  8. set<int> withX[1+MAX_V], withY[1+MAX_V];
  9.  
  10. int main() {
  11.     int n; cin >> n;
  12.     vector<int> x(1+n), y(1+n);
  13.     for (int i = 1; i <= n; ++i) {
  14.         cin >> x[i] >> y[i];
  15.         withX[x[i]].insert(i);
  16.         withY[y[i]].insert(i);
  17.     }
  18.  
  19.     string ans(1+n, ' ');
  20.     for (int start = 1; start <= n; ++start) {
  21.         if (ans[start] != ' ') continue;
  22.         auto goFrom = [&](int node, int dir) {
  23.             while (node != -1) {
  24.                 // find the next node
  25.                 withX[x[node]].erase(node);
  26.                 withY[y[node]].erase(node);
  27.                 int fol;
  28.                 if (dir == 0) {
  29.                     if (withX[x[node]].empty()) fol = -1;
  30.                     else fol = *withX[x[node]].begin();
  31.                 } else {
  32.                     if (withY[y[node]].empty()) fol = -1;
  33.                     else fol = *withY[y[node]].begin();
  34.                 }
  35.  
  36.                 if (fol != -1) ans[fol] = 'A' + 'B' - ans[node];
  37.                 node = fol;
  38.                 dir = 1 - dir;
  39.             }
  40.         };
  41.         ans[start] = 'A';
  42.         goFrom(start, 0);
  43.         goFrom(start, 1);
  44.     }
  45.     for (int i = 1; i <= n; ++i) cout << ans[i];
  46.     cout << endl;
  47.     return 0;
  48. }
  49.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement