Submission #38051

#TimeUsernameProblemLanguageResultExecution timeMemory
38051funcsrParachute rings (IOI12_rings)C++14
20 / 100
4027 ms1228 KiB
#include <iostream>
#include <vector>
#include <string>
#define rep(i, n) for (int i=0; i<(n); i++)
#define pb push_back
using namespace std;

int N;
vector<int> G[5000];
int cnt[5000];
void Init(int N_) {
  N = N_;
  cnt[0] = N;
  if (N > 5000) abort();
}

void Link(int A, int B) {
  cnt[G[A].size()]--;
  cnt[G[B].size()]--;
  G[A].pb(B);
  G[B].pb(A);
  cnt[G[A].size()]++;
  cnt[G[B].size()]++;
}
bool has_cycle;
bool used[5000];
void dfs(int x, int p, int except) {
  used[x] = true;
  for (int t : G[x]) if (t != p && t != except) {
    if (used[t]) { has_cycle = true; break; }
    dfs(t, x, except);
  }
}

int CountCritical() {
  int ctr = 0;
  rep(i, N) {
    rep(j, N) used[j] = false;
    has_cycle = false;
    rep(j, N) if (i != j && !used[j]) dfs(j, -1, i);
    if (has_cycle) continue;
    for (int t : G[i]) {
      cnt[G[t].size()]--;
      cnt[G[t].size()-1]++;
    }
    cnt[G[i].size()]--;
    if (cnt[0]+cnt[1]+cnt[2] == N-1) ctr++;
    cnt[G[i].size()]++;
    for (int t : G[i]) {
      cnt[G[t].size()-1]--;
      cnt[G[t].size()]++;
    }
  }
  return ctr;
}
#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...