Submission #1023178

#TimeUsernameProblemLanguageResultExecution timeMemory
1023178NeroZeinFountain Parks (IOI21_parks)C++17
30 / 100
376 ms47528 KiB
#include "parks.h"
#include <bits/stdc++.h>
using namespace std; 

const int N = 2e5 + 5;

int p[N];
int sz[N];
vector<pair<int, int>> inY[N];

int get(int v) {
  return p[v] = (p[v] == v ? v : get(p[v]));
}

void unite(int u, int v) {
  u = get(u);
  v = get(v);
  if (sz[u] > sz[v]) swap(u, v);
  p[u] = v;
  sz[v] += sz[u];
}

int construct_roads(vector<int> vx, vector<int> vy) {
  int n = (int) vx.size();
  map<pair<int, int>, int> mp;
  for (int i = 0; i < n; ++i) {
    p[i] = i;
    sz[i] = 1;
    mp[{vx[i], vy[i]}] = i;
    inY[vy[i]].emplace_back(vx[i], i); 
  }
  for (int y = 2; y < N; y += 2) {
    sort(inY[y].begin(), inY[y].end());
  }
  set<pair<int, int>> se; 
  vector<int> u, v, a, b;
  for (int y = 2; y < N; y += 2) {
    for (auto [x, i] : inY[y]) {
      if (mp.count({x + 2, y})) {
        int id = mp[{x + 2, y}];
        if (get(id) != get(i)) {
          unite(i, id); 
          u.push_back(i);
          v.push_back(id);
          if (!se.count({x + 1, y - 1})) {
            se.insert({x + 1, y - 1});
            a.push_back(x + 1);
            b.push_back(y - 1);
          } else {
            assert(!se.count({x + 1, y + 1}));
            se.insert({x + 1, y + 1});
            a.push_back(x + 1);
            b.push_back(y + 1); 
          }
        }
      }
      if (mp.count({x, y + 2})) {
        int id = mp[{x, y + 2}];
        if (get(id) != get(i)) {
          unite(i, id);
          u.push_back(i);
          v.push_back(id);
          if (!se.count({x - 1, y + 1})) {
            se.insert({x - 1, y + 1});
            a.push_back(x - 1);
            b.push_back(y + 1); 
          } else {
            assert(!se.count({x + 1, y + 1}));
            se.insert({x + 1, y + 1});
            a.push_back(x + 1);
            b.push_back(y + 1);
          }
        }
      }
    }
  }
  if (sz[get(0)] != n) {
    return 0;
  }
  build(u, v, a, b); 
  return 1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...