제출 #23493

#제출 시각아이디문제언어결과실행 시간메모리
23493ruhanhabib39Unscrambling a Messy Bug (IOI16_messy)C++14
100 / 100
7 ms640 KiB
#include <vector>
#include <string>
#include <iostream>

#include "messy.h"

void build(int n, int l, int r) {
  if(l == r) return;
  int m = (l + r) / 2;
  std::string ss(n, '1');
  for(int i = l; i <= r; i++) {
    ss[i] = '0';
  }
  for(int i = l; i <= m; i++) {
    ss[i] = '1';
    add_element(ss);
    ss[i] = '0';
  }
  build(n, l, m); build(n, m+1, r);
}

void work(int n, std::vector<int>& res, std::vector<int> v, int l, int r) {
  // std::cerr << l << " " << r << " " << v.size() << "\n";
  if(l == r) {
    res[v[0]] = l;
    return;
  }
  int m = (l + r) / 2;
  std::string ss(n, '1');
  for(int i : v) {
    ss[i] = '0';
  }
  std::vector<int> lf, rh;
  for(int i : v) {
    ss[i] = '1';
    if(check_element(ss)) lf.push_back(i);
    else rh.push_back(i);
    ss[i] = '0';
  }
  work(n, res, lf, l, m);
  work(n, res, rh, m+1, r);
}

std::vector<int> restore_permutation(int n, int w, int r) {
    build(n, 0, n-1);
    compile_set();
    std::vector<int> res(n, 0);
    std::vector<int> vec(n);
    for(int i = 0; i < n; i++) {
      vec[i] = i;
    }
    work(n, res, vec, 0, n-1);
    return res;
}
#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...