Submission #238336

#TimeUsernameProblemLanguageResultExecution timeMemory
238336Jatana자동 인형 (IOI18_doll)C++17
66.61 / 100
259 ms10176 KiB
#include "doll.h" #include <iostream> #include <algorithm> #include <cassert> #include <random> #define le(v) ((int)v.size()) #define pb push_back using namespace std; vector<int> X, Y; int inc = 0; int go(int outs) { int id = le(X); X.pb(-1e9); Y.pb(-1e9); if (outs > 2) { if (outs & 1) { outs++; inc++; } X[id] = go(outs / 2); Y[id] = go(outs / 2); } else assert(outs == 2); return -(id + 1); } vector<int> gen(int k) { if (k == 0) return {0}; vector<int> sub = gen(k - 1); vector<int> real; for (int i = 0; i < le(sub); i++) { real.pb(sub[i]); real.pb(sub[i] + (1 << (k - 1))); } return real; } vector<int> inv(vector<int> p) { vector<int> q(le(p)); for (int i = 0; i < le(p); i++) { q[p[i]] = i; } return q; } mt19937 rng(1337); void create_circuit(int M, vector<int> A) { X.clear(); Y.clear(); int N = A.size(); A.pb(0); int sz = le(A); inc = 0; int root = go(sz); int wait = inc; reverse(A.begin(), A.end()); vector<int> C(M + 1, root); C[0] = root; int cur = root; int real = -1; while (cur) { // cerr << cur << " "; if (cur > 0) { real = cur; cur = C[cur]; } else { cur = (-cur) - 1; if (X[cur] == -1e9) { bool cond = (1 + wait + le(A)) % 2; // bool cond = binary_search(order[real].begin(), order[real].end(), it[real]); if (wait && ((le(A) == 1) || cond)) { wait--; X[cur] = root; } else { // cout << "decide" << endl; X[cur] = A.back(); A.pop_back(); } } swap(X[cur], Y[cur]); cur = Y[cur]; } } // cerr << endl; // return; vector<bool> del(le(X), false); for (int it = 0; it < 100; it++) { for (int i = 0; i < le(X); i++) { if (del[i]) continue; if (X[i] < 0) { int j = (-X[i]) - 1; if (X[j] == Y[j]) { X[i] = X[j]; del[j] = true; } } if (Y[i] < 0) { int j = (-Y[i]) - 1; if (X[j] == Y[j]) { Y[i] = X[j]; del[j] = true; } } } for (int i = 0; i < le(C); i++) { if (C[i] < 0) { int j = (-C[i]) - 1; if (X[j] == Y[j]) { C[i] = X[j]; del[j] = true; } } } if (it == 0) { int killed = 0; for (int x : del) killed++; // cout << "killed: " << killed << endl; } } vector<int> alive; for (int i = 0; i < le(X); i++) { if (!del[i]) { alive.pb(i); } } for (int i = 0; i < le(X); i++) { if (X[i] < 0) { int id = lower_bound(alive.begin(), alive.end(), (-X[i]) - 1) - alive.begin(); X[i] = -(id + 1); } if (Y[i] < 0) { int id = lower_bound(alive.begin(), alive.end(), (-Y[i]) - 1) - alive.begin(); Y[i] = -(id + 1); } } for (int i = 0; i < le(C); i++) { if (C[i] < 0) { int id = lower_bound(alive.begin(), alive.end(), (-C[i]) - 1) - alive.begin(); C[i] = -(id + 1); } } int jump = 0; for (int i = 0; i < le(X); i++) { if (del[i]) { jump++; } else { X[i - jump] = X[i]; Y[i - jump] = Y[i]; } } X.resize(le(X) - jump); Y.resize(le(Y) - jump); // for (int x : del) { // cout << x << " "; // } // cout << endl; // for (int i = 0; i < le(X); i++) { // cout << X[i] << " " << Y[i] << endl; // } answer(C, X, Y); }

Compilation message (stderr)

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:115:13: warning: unused variable 'x' [-Wunused-variable]
  115 |    for (int x : del) killed++;
      |             ^
doll.cpp:48:6: warning: unused variable 'N' [-Wunused-variable]
   48 |  int N = A.size();
      |      ^
doll.cpp:58:6: warning: variable 'real' set but not used [-Wunused-but-set-variable]
   58 |  int real = -1;
      |      ^~~~
#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...