Submission #576139

#TimeUsernameProblemLanguageResultExecution timeMemory
576139lumibonsFriends (BOI17_friends)C++17
100 / 100
284 ms1492 KiB
#include <bits/stdc++.h>

using namespace std;

int n, p, q;
bool f[3000], m[3000];
vector<int> e[3000];

void mark(vector<int> & g, bool v) {
  for (int i : g)
    m[i] = v;
}

bool anyMarked(vector<int> & g) {
  for (int i : g)
    if (m[i])
      return true;
  return false;
}

bool valid(vector<int> & g) {
  mark(g, true);
  int cq = 0;
  for (int i : g)
    for (int j : e[i])
      cq += !m[j];
  return cq <= q;
}

vector<int> withoutMarked(vector<int> & g) {
  vector<int> h;
  for (int i : g)
    if (!m[i])
      h.push_back(i);
  return h;
}

int main() {
  cin >> n >> p >> q;
  set<pair<int, int>> ed;
  for (int i = 0; i < n; i++) {
    int m, j;
    cin >> m;
    while (m--) {
      cin >> j;
      e[i].push_back(j);
      ed.emplace(i, j);
    }
  }
  for (auto [i, j] : ed)
    if (ed.find({j, i}) == ed.end()) {
      cout << "detention\n";
      return 0;
    }
  vector<vector<int>> par;
  for (int i = 0; i < n; i++) {
    if (f[i])
      continue;
    vector<int> g = {i};
    for (int b = 0; b < (1 << (p + q - 1)) && !f[i];) {
      int gi = 0, gj = 0, cp = 1, cq = 0, k = p + q - 1;
      m[i] = true;
      while (gi < (int) g.size()) {
        if (gj == (int) e[g[gi]].size())
          gi++, gj = 0;
        else if (m[e[g[gi]][gj]])
          gj++;
        else if (k == 0)
          break;
        else {
          bool ig = (b >> --k) & 1;
          if (ig && cp == p || !ig && cq == q)
            break;
          if (ig)
            cp++, m[e[g[gi]][gj]] = true, g.push_back(e[g[gi]][gj]);
          else
            cq++;
          gj++;
        }
      }
      if (gi < (int) g.size()) {
        mark(g, false);
        g.resize(1);
        b &= ~((1 << k) - 1);
        b += 1 << k;
      } else {
        for (int j : g)
          f[j] = true;
        break;
      }
    }
    if (!f[i]) {
      cout << "detention\n";
      return 0;
    }
    for (vector<int> & h : par) {
      if (!anyMarked(h))
        continue;
      vector<int> hw = withoutMarked(h);
      mark(g, false);
      if (valid(hw))
        mark(h, false), h = hw;
      else
        g = withoutMarked(g), mark(h, false);
      mark(g, true);
    }
    mark(g, false);
    par.push_back(g);
  }
  vector<vector<int>> res;
  for (vector<int> & g : par)
    if (!g.empty())
      res.push_back(g);
  cout << "home\n" << res.size() << "\n";
  for (vector<int> & g : res) {
    cout << g.size();
    for (int i : g)
      cout << " " << i;
    cout << "\n";
  }
}

Compilation message (stderr)

friends.cpp: In function 'int main()':
friends.cpp:72:18: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   72 |           if (ig && cp == p || !ig && cq == q)
      |               ~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...