제출 #1306955

#제출 시각아이디문제언어결과실행 시간메모리
1306955KickingKunMeetings (JOI19_meetings)C++20
17 / 100
690 ms106284 KiB
#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 300;
int save[MAXN][MAXN][MAXN];

int get(int a, int b, int c) {
  if (a > b) swap(a, b);
  if (a > c) swap(a, c);
  if (b > c) swap(b, c);

  if (save[a][b][c] != -1) return save[a][b][c];
  return save[a][b][c] = Query(a, b, c);
}

void Solve(int n) {
  memset(save, -1, sizeof save);

  int root = 0;
  vector <tuple <int, int, bool>> edges;

  for (int v = 1; v < n; v++) {
    bool isEdge = true;
    for (int w = 1; w < n && isEdge; w++) if (v != w) {
      if (get(root, w, v) == w) isEdge = false;
    }
    if (isEdge) edges.emplace_back(root, v, false);
  }

  while (edges.size() < n - 1) {
    for (auto &[u, v, calc]: edges) if (calc == false) {
      vector <int> candidates;
      for (int w = 0; w < n; w++) if (u != w && v != w) {
        if (get(u, v, w) == v) {
          bool bad = false;
          for (int i = 0; i < (int)candidates.size() && !bad;) {
            int cur = get(v, w, candidates[i]);
            if (cur == w) {
              swap(candidates[i], candidates.back());
              candidates.pop_back();
            }
            else if (cur == candidates[i]) bad = true;
            else ++i;
          }
          if (!bad) candidates.emplace_back(w);
        }
      }

      if (candidates.empty()) calc = true;
      else {
        calc = true; int saveV = v;
        for (int nxt: candidates) {
          edges.emplace_back(saveV, nxt, false);
        }
        break;
      }
    }
  }

  // cerr << "Edge size " << edges.size() << endl;
  for (auto &[u, v, calc]: edges) {
    if (u > v) swap(u, v);
    Bridge(u, v);
    // cerr << "bridge " << u << ' ' << v << endl;
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...