Submission #597231

#TimeUsernameProblemLanguageResultExecution timeMemory
597231Sam_a17Mechanical Doll (IOI18_doll)C++14
47 / 100
146 ms25336 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ld long double
#define sz(x) x.size()
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()

void answer(std::vector<int> C, std::vector<int> X, std::vector<int> Y);
const int maxN = 5e5 + 10;
vector<int> adj[maxN];

template<typename T>
void pr(T a) {
  cerr << a << endl;
}

pair<int, int> child[maxN];
pair<bool, bool> valid[maxN];
vector<int> order, low;
int curr = 0, par[maxN], pos = -1, xd = 0;

void build(int h, int node, vector<int>& x, vector<int>& y, int lg) {
  if(h == lg) {
    child[-node].first = curr++;
    child[-node].second = curr++;

    par[curr - 2] = node;
    par[curr - 1] = node;

    low.push_back(node);
  } else {
    child[-node].first = pos - 1;
    child[-node].second = pos - 2;
    
    x.push_back(child[-node].first);
    y.push_back(child[-node].second);

    pos -= 2;

    build(h + 1, child[-node].first, x, y, lg);
    build(h + 1, child[-node].second, x, y, lg);
  }
}

void traverse(int node, int h, int lg) {
  if(h == lg + 1) {
    assert(node >= 0);
    order.push_back(node);
    return;
  }

  traverse(child[-node].first, h + 1, lg);
  swap(child[-node].first, child[-node].second);
}

void create_circuit(int M, std::vector<int> A) {
	int n = sz(A);

  if(n == 1) {
		vector<int> to(M + 1, 1), x, y;
    to[0] = A[0];
    to[A[0]] = 0;

    answer(to, x, y);
    return;
  }

    vector<int> to(M + 1, -1), x, y;
    int logi = log2(n);

    if(n == (1 << logi)) {
      logi--;
    }

    // cout << logi << endl;

    build(0, -1, x, y, logi);

    for(int i = 0; i < (1 << (logi + 1)); i++) {
      traverse(-1, 0, logi); 
    }

    // cout << xd << endl;

    // for(auto i: order) {
      // cout << i << " ";
    // } cout << endl;


    int power = (1 << (logi + 1)) - n;
    // cout << "pr:" << power << endl;

    // cout << power << " " << (1 << logi) << endl;

    for(int i = 0; i < power; i++) {
      // cout << order[i] << endl;
      if(!valid[-par[order[i]]].first) {
        valid[-par[order[i]]].first = 1;
        child[-par[order[i]]].first = -1;
      } else {
        valid[-par[order[i]]].second = 1;
        child[-par[order[i]]].second = -1;
      }
    }

    // cout << "done" << endl;
    // cout << sz(order) << endl;

    // for(auto i: order) {
    //   cout << i << " ";
    // } cout << endl;

    A.push_back(0);
    int j = 1;
    for(int i = power; i < (1 << (logi + 1)); i++) {
      if(!valid[-par[order[i]]].first) {
        valid[-par[order[i]]].first = 1;
        child[-par[order[i]]].first = A[j];
      } else {
        valid[-par[order[i]]].second = 1;
        child[-par[order[i]]].second = A[j];
      }
      j++;
    } 

    for(auto i: low) {
      x.push_back(child[-i].first);
      y.push_back(child[-i].second);
    }

    to[0] = A[0];

    answer(to, 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...