Submission #88392

#TimeUsernameProblemLanguageResultExecution timeMemory
88392memikakizakiMechanical Doll (IOI18_doll)C++14
100 / 100
200 ms25656 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 4e5+1;

int m, n, need, nodes, c[N], l[N], r[N], x[N], y[N];
vector<int> a;
vector<int> ls[N];

bool state[N], leaf_l[N], leaf_r[N];

void dfs(int i, int val) {
  bool org = state[i];
  state[i] ^= 1;
  if(org) {
    if(r[i] == -1) {
      // cout << i << " r" << ' ' << val << endl;
      y[i] = val;
    } else dfs(r[i], val);
  } else {
    if(l[i] == -1) {
      // cout << i << " l" << ' ' << val << endl;
      x[i] = val;
    } else dfs(l[i], val);
  }
}

void create_circuit(int _m, vector<int> _a) {
  m = _m, a = _a;
  n = a.size();
  a.insert(a.begin(), 0);
  a.push_back(0);

  for(int i = 0; i < (int) a.size() - 1; i++) ls[a[i]].push_back(a[i+1]);

  for(int i = 0; i <= m; i++) {
    if(ls[i].empty()) c[i] = 1;
    else if(ls[i].size() == 1) c[i] = ls[i][0];
    else c[i] = -1;
  }

  for(int i = 0; i < (int) a.size() - 1; i++) need += ls[a[i]].size() > 1;

  int lgn = log2(need);

  for(int i = 1; i <= lgn + 1; i++) {
    if(i <= lgn) l[i] = i+1, x[i] = -l[i];
    else {
      l[i] = 1;
      r[i] = (need % 2 ? -1 : 1);
      leaf_l[i] = leaf_r[i] = 1;
      x[i] = y[i] = -1;
    }
  }
  nodes += log2(need) + 1;
  for(int i = 1; i <= lgn; i++) {
    int sz = 1 << (lgn + 1 - i);
    if(need & sz) {
      r[i] = nodes + 1;
      y[i] = -r[i];
      for(int t = 1; t < sz; t++) {
        if(t < sz / 2) {
          l[nodes + t] = nodes + (t << 1);
          r[nodes + t] = nodes + (t << 1 | 1);
          x[nodes + t] = -l[nodes + t];
          y[nodes + t] = -r[nodes + t];
        } else {
          leaf_l[nodes + t] = leaf_r[nodes + t] = 1;
          l[nodes + t] = r[nodes + t] = -1;
        }
      }
      nodes += sz - 1;
    } else {
      r[i] = 1;
      y[i] = -1;
      leaf_r[i] = 1;
    }
    // cout << i << ' ' << nodes << ' ' << sz << ' ' << l[i] << ' ' << leaf_l[i] << ' ' << r[i] << ' ' << leaf_r[i] << endl;
  }
  // for(int i = 1; i <= nodes; i++) {
  //   cout << i << ' ' << l[i] << ' ' << r[i] << ' ' << leaf_l[i] << ' ' << leaf_r[i] << endl;
  // }
  //
  for(int i = 0; i < (int) a.size() - 1; i++) {
    if(ls[a[i]].size() <= 1) continue;
    dfs(1, a[i+1]);
  }
  vector<int> C, X, Y;
  for(int i = 0; i <= m; i++) C.push_back(c[i]);
  for(int i = 1; i <= nodes; i++) X.push_back(x[i]), Y.push_back(y[i]);

  // for(int i = 1; i <= nodes; i++) cout << -i << ' ' << x[i] << ' ' << 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...