Submission #42795

#TimeUsernameProblemLanguageResultExecution timeMemory
42795funcsrUnscrambling a Messy Bug (IOI16_messy)C++14
70 / 100
4 ms896 KiB
#include "messy.h"
#include <iostream>
#include <vector>
#include <string>
#include <cassert>
using namespace std;
#define rep(i, n) for (int i=0; i<(n); i++)
#define INF 1145141919

vector<int> restore_permutation(int n, int w, int r) {
  int x = n;
  int logn = 0;
  while (x>=2) logn++, x/=2;
  assert(logn < n-logn);
  string ones(n, '1');
  rep(i, logn) {
    ones[i] = '0';
    assert(w-- > 0);
    add_element(ones);
  }
  for (int i=logn; i<n; i++) {
    string zeros(n, '0');
    zeros[i] = '1';
    //add_element(zeros);
    rep(k, logn) if ((i>>k)&1) {
      zeros[k] = '1';
      assert(w-- > 0);
      add_element(zeros);
    }
  }
  vector<int> ret(n, -1), rev(n, -1);
  compile_set();
  string pat(n, '1');
  rep(i, logn) {
    int pos = -1;
    rep(p, n) if (pat[p] == '1') {
      pat[p] = '0';
      assert(r-- > 0);
      if (check_element(pat)) {
        pos = p;
        break;
      }
      pat[p] = '1';
    }
    assert(pos != -1 && rev[pos] == -1);
    ret[i] = pos;
    rev[pos] = i;
    pat[pos] = '0';
  }
  rep(i, n) if (rev[i] == -1) {
    string s(n, '0');
    s[i] = '1';
    //assert(check_element(s));
    int pos = 0;
    rep(j, logn) {
      s[ret[j]] = '1';
      assert(r-- > 0);
      if (check_element(s)) {
        pos |= 1<<j;
      }
      else s[ret[j]] = '0';
    }
    assert(ret[pos] == -1);
    ret[pos] = i;
    rev[i] = pos;
  }
  return rev;
}
#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...