제출 #620083

#제출 시각아이디문제언어결과실행 시간메모리
620083Mamedov자동 인형 (IOI18_doll)C++17
53 / 100
99 ms15396 KiB
#pragma GCC optimize ("O3")
#include "doll.h"
#include <bits/stdc++.h>
#define pii pair<int, int>
#define piii pair<pii, int>
#define vi vector<int>
#define vvi vector<vi>
#define vpii vector<pii>
#define vvpii vector<vpii>
#define f first
#define s second
#define oo 1000000001
#define eb emplace_back
#define pb push_back
#define mpr make_pair
#define size(v) (int)v.size()
#define ln '\n'
#define ull unsigned long long
#define ll long long
#define all(v) v.begin(), v.end()

using namespace std;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

void create_circuit(int M, vi A) {
  int N = size(A);
  A.eb(0);
  vvi g(M + 1);
  for (int i = 0; i < N; ++i) {
    g[A[i]].eb(A[i + 1]);
  }
  vi C(M + 1, 0), X, Y;
  int S = 0;
  C[0] = A[0];
  for (int i = 1; i <= M; ++i) {
    int ways = size(g[i]);
    if (ways) {
      int pins = 2;
      C[i] = -(S + pins - 1);
      X.eb(oo);
      Y.eb(oo);
      while (pins < ways) {
        for (int j = pins / 2; j < pins; ++j) {
          X[S + j - 1] = -(S + 2 * j);
          Y[S + j - 1] = -(S + 2 * j + 1);
          X.eb(oo);
          Y.eb(oo);
          X.eb(oo);
          Y.eb(oo);
        }
        pins *= 2;
      }
      vi order;
      order.eb(pins);
      int sz = 1;
      while (pins != 1) {
        pins /= 2;
        for (int j = 0; j < sz; ++j) {
          order.eb(order[j] + pins);
        }
        sz *= 2;
      }
      while (!order.empty()) {
        --ways;
        if ((order.back() & 1)) {
          Y[S + order.back() / 2 - 1] = (ways >= 0 ? g[i][ways] : -(S + 1));
        } else {
          X[S + order.back() / 2 - 1] = (ways >= 0 ? g[i][ways] : -(S + 1));
        }
        order.pop_back();
      }
      S = size(X);
    }
  }
  for (int i = 0; i < S; ++i) {
    if (Y[i] == oo) {
      Y[i] = X[i];
      X[i] = -(i + 1);
    }
  }
  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...