제출 #441149

#제출 시각아이디문제언어결과실행 시간메모리
441149prvocisloMechanical Doll (IOI18_doll)C++17
12 / 100
125 ms20416 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;

const int maxvr = 2e5 + 100;
vector<int> num(maxvr); // naozajstne cisla vrcholov v strome. Teda switche budu zaporne a prvych m cisel budu v skutocnosti nieco ine
vector<vector<int> > g(maxvr);
int n, m, s, lf, root, first; // mame fiktivny n+1-vy trigger na to aby sme sa vratili do 0
int dfs(int l, int r)
{
  if (r < first) return root;
  if (l == r) return lf++;
  int now = s;
  s++;
  g[now].push_back(dfs(l, (l+r)/2));
  g[now].push_back(dfs((l+r)/2+1, r));
  return now;
}
vector<int> stav(maxvr, 0);
int get_next() // ideme na nasledujuci vrchol ktory ma cislo mensie ako n
{
  int vr = root;
  while (vr >= n)
  {
    int nw = g[vr][stav[vr]];
    stav[vr] ^= 1;
    vr = nw;
  }
  return vr;
}
void create_circuit(int M, vector<int> a) {
  m = M;
  a.push_back(0), n = a.size();
  lf = 0, s = n;
  int n2 = 1;
  while (n2 < n) n2 <<= 1;
  root = n, first = n2 - n; dfs(0, n2 - 1);
  for (int i = 0; i < n; i++)
  {
    int vr = get_next();
    num[vr] = a[i];
  }
  for (int i = n; i < s; i++)
  {
    num[i] = -(i - (n-1));
  }
  vector<int> c(m+1, num[root]), x(s-n), y(s-n);
  for (int i = n; i < s; i++)
  {
    x[i-n] = num[g[i][0]];
    y[i-n] = num[g[i][1]];
  }
  /*for (int i = 0; i <= m; i++) cout << i << " " << c[i] << endl;
  for (int i = 0; i < x.size(); i++)
  {
    cout << -(i+1) << " " << x[i] << endl;
    cout << -(i+1) << " " << y[i] << endl;
  }*/
  answer(c, x, y);
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...