Submission #258405

#TimeUsernameProblemLanguageResultExecution timeMemory
258405ipaljakUnscrambling a Messy Bug (IOI16_messy)C++14
100 / 100
3 ms640 KiB
#include "messy.h"

#include <bits/stdc++.h>

using namespace std;

#define TRACE(x) cerr << #x << " " << x << endl
#define _ << " " <<

void add_elements(int lo, int hi, int n) {
  if (lo + 1 == hi) return;
  string s(n, '0');
  for (int i = 0; i < n; ++i)
    if (i < lo || i >= hi) s[i] = '1';
  for (int i = lo; i < (lo + hi) / 2; ++i) {
    s[i] = '1';
    add_element(s);
    s[i] = '0';
  }
  add_elements(lo, (lo + hi) / 2, n);
  add_elements((lo + hi) / 2, hi, n);
}

void solve(int lo, int hi, int n, const set<int> &target, vector<int> &p) {
  assert(hi - lo == (int) target.size());
  if (lo + 1 == hi) {
    p[*target.begin()] = lo;
    return;
  }

  string s(n, '0');
  for (int i = 0; i < n; ++i)
    if (target.find(i) == target.end())
      s[i] = '1';

  set<int> a, b;
  for (int x : target) {
    s[x] = '1';
    bool flag = check_element(s);
    s[x] = '0';
    if (flag) a.insert(x); else b.insert(x);
  }

  assert(a.size() == b.size());

  solve(lo, (lo + hi) / 2, n, a, p);
  solve((lo + hi) / 2, hi, n, b, p);
}

vector<int> restore_permutation(int n, int w, int r) {
  add_elements(0, n, n);
  compile_set();
  vector<int> ret(n);
  set<int> dest;
  for (int i = 0; i < n; ++i) dest.insert(i);
  solve(0, n, n, dest, ret);
  return ret;
}
#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...