Submission #1164009

#TimeUsernameProblemLanguageResultExecution timeMemory
1164009HappyCapybaraParachute rings (IOI12_rings)C++20
0 / 100
237 ms87084 KiB
#include<bits/stdc++.h>
using namespace std;

vector<int> p;

int find(int a){
  if (a == p[a]) return p[a];
  return p[a] = find(p[a]);
}

void merge(int a, int b){
  a = find(a);
  b = find(b);
  if (a == b) return;
  p[b] = a;
}

bool ol = false;
int n, nc;
vector<int> deg;
unordered_set<int> s, cycle;
vector<vector<int>> g;

void Init(int N) {
  n = N;
  nc = -1;
  deg.resize(n, 0);
  for (int i=0; i<n; i++){
    s.insert(i);
    g.push_back({i});
    p.push_back(i);
  }
}

void path(int a, int b){
  vector<int> par(n, -1);
  par[a] = a;
  queue<int> q;
  q.push(a);
  while (!q.empty()){
    int cur = q.front();
    q.pop();
    if (cur == b){
      cycle.insert(b);
      while (cur != a){
        cycle.insert(par[cur]);
        cur = par[cur];
      }
      return;
    }
    for (int next : g[cur]){
      if (par[next] == -1 && next != cur){
        par[next] = cur;
        q.push(next);
      }
    }
  }
}

void Link(int A, int B){
  if (s.empty()) return;
  deg[A]++;
  deg[B]++;
  if (deg[A] == 4){
    if (s.find(A) != s.end()){
      s.clear();
      s.insert(A);
    }
    else s.clear();
  }
  if (deg[B] == 4){
    if (s.find(B) != s.end()){
      s.clear();
      s.insert(B);
    }
    else s.clear();
  }
  if (deg[A] == 3){
    for (int x : s){
      if (count(g[A].begin(), g[A].end(), x) == 0) s.erase(x);
    }
  }
  if (deg[B] == 3){
    for (int x : s){
      if (count(g[B].begin(), g[B].end(), x) == 0) s.erase(x);
    }
  }
  if (s.empty()) return;
  if (find(A) == find(B)){
    if (ol){
      s.clear();
      return;
    }
    if (nc == -1){
      cycle.clear();
      path(A, B);
      /*for (int x : cycle) cout << x << " ";
      cout << endl;*/
      for (int x : s){
        if (cycle.find(x) == cycle.end()) s.erase(x);
      }
      if (s.empty()) return;
      nc = find(A);
    }
    else if (nc >= 0){
      if (find(A) != nc){
        s.clear();
        return;
      }
      cycle.clear();
      path(A, B);
      for (int x : s){
        if (cycle.find(x) == cycle.end()) s.erase(x);
      }
      nc = -2;
    }
    else if (nc == -2){
      if (s.size() != 1){
        s.clear();
        return;
      }
    }
  }
  if (s.empty()) return;
  if (!ol || (A != *s.begin() && B != *s.begin())) merge(A, B);
  g[A].push_back(B);
  g[B].push_back(A);

  if (s.size() == 1 && !ol){
    ol = true;
    for (int i=0; i<n; i++) p[i] = i;
    for (int i=0; i<n; i++){
      if (i == *s.begin()) continue;
      for (int j : g[i]){
        if (j == *s.begin()) continue;
        merge(i, j);
      }
    }
  }
}

int CountCritical() {
  return s.size();
}
#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...