제출 #1237403

#제출 시각아이디문제언어결과실행 시간메모리
1237403mychecksedad자동 인형 (IOI18_doll)C++20
53 / 100
127 ms17832 KiB
#include "doll.h"
#include<bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
#define pb push_back
#define vi vector<int>
#define ff first
#define ss second
#define ll long long int
#define pii pair<int,int>
const int N = 2e5+100, M = 5010, K = 22;


vi go[N];
void create_circuit(int m, std::vector<int> A) {
  int n = A.size();

  for(int i = 0; i < n; ++i){
    go[A[i]].pb(i + 1 == n ? 0 : A[i + 1]);
  }

  vi C(m + 1);
  C[0] = A[0];
  int cnt = 1;
  vi X, Y;
  for(int i = 1; i <= m; ++i){
    if(go[i].empty()){
      C[i] = 1;
    }else if(go[i].size() == 1){
      C[i] = go[i][0];
    }else{
      // for(int x: go[i]) cerr << x << ' ';
      // we gotta do some stuff...
      int sz;
      int n = go[i].size();
      for(int j = 0; ; ++j){
        if((1<<j) >= n){
          sz = j;
          break;
        }
      }
      // cerr << sz << ' ';
      // we'll build a segtree
      int fr = (1<<sz) - n; // number of bad guys, first fr states will be just redirecting to the root
      // sz is actually number of layers, i-th layer has (1<<(i-1)) nodes
      int root = cnt++;
      // cerr << i << ' ';
      // cerr << fr << ' ' << sz << " crap\n";
      C[i] = -root;
      vector<vi> layer(sz);
      layer[0].pb(root);
      for(int bit = 1; bit < sz; ++bit){
        for(int num = 0; num < (1<<bit); ++num){
          layer[bit].pb(cnt++);
        }
      }
      // for(int i = 0; i < sz; ++i){
      //   for(int x: layer[i]) cerr << x << ' ' << i << '\n';
      // }
      for(int bit = 0; bit + 1 < sz; ++bit){
        for(int num = 0; num < layer[bit].size(); ++num){
          X.pb(-layer[bit + 1][num * 2]);
          Y.pb(-layer[bit + 1][num * 2 + 1]);
        }
      }
      vector<pii> pts;
      for(int num = 0; num < (1<<(sz-1)); ++num){
        pts.pb({int(X.size()), 0});
        pts.pb({int(Y.size()), 1});
        X.pb(-1); // smth
        Y.pb(-1); // something...
      }
      vector<pii> ord;
      for(int ii = 0; ii < (1<<sz); ++ii){
        vi bits;
        for(int j = 0; j < sz; ++j) bits.pb(((1<<j)&ii) > 0);
        reverse(all(bits));
        int ordd = 0;
        for(int j = 0; j < sz; ++j) ordd += bits[j] * (1<<j);
        ord.pb({ordd, ii});
      }
      sort(all(ord));
      // for(auto [x,y ]: ord) cerr << x << ' ' << y << '\n';
      for(int j = 0; j < fr; ++j){
        int id = ord[j].ss;
        if(pts[id].ss == 0){
          X[pts[id].ff] = -root;
        }else{
          Y[pts[id].ff] = -root;
        }
      }
      for(int j = fr; j < (1<<sz); ++j){
        int id = ord[j].ss;
        if(pts[id].ss == 0){
          X[pts[id].ff] = go[i][j - fr];
        }else{
          Y[pts[id].ff] = go[i][j - fr];
        }
      }
    }
  }

  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...