Submission #1043255

#TimeUsernameProblemLanguageResultExecution timeMemory
1043255yanbMechanical Doll (IOI18_doll)C++14
66.60 / 100
58 ms17732 KiB
#include <bits/stdc++.h> using namespace std; //#define int long long #define pii pair<int, int> void answer(vector<signed> C, vector<signed> X, vector<signed> Y); void dfs(vector<int> &X, vector<int> &Y, int v) { int u = X[-v - 1]; if (u < -1) { dfs(X, Y, u); if (X[-u - 1] == -1 && Y[-u - 1] == -1) X[-v - 1] = -1; } u = Y[-v - 1]; if (u < -1) { dfs(X, Y, u); if (X[-u - 1] == -1 && Y[-u - 1] == -1) Y[-v - 1] = -1; } } void create_circuit(int k, vector<int> a) { a.push_back(0); int n = a.size(); vector<int> C(k + 1, -1), X, Y; int cnt = n; int z = 1, ord = 0; while (z < cnt) { z *= 2; ord++; } ord = max(1, ord); vector<int> p(z); p[0] = 0; for (int i = 0; i < ord; i++) { for (int ni = 0; ni < (1 << i); ni++) { p[(1 << i) + ni] = p[ni] + (1 << (ord - i - 1)); } } for (int i = 0; i < z - n; i++) p[i] = -1; vector<pii> mp(z); for (int i = 0; i < z; i++) mp[i] = {p[i], i}; sort(mp.begin(), mp.end()); for (int i = z - n; i < z; i++) { p[mp[i].second] = i - z + n; } vector<int> v(z); for (int i = 0; i < z; i++) { v[i] = (p[i] == -1 ? -1 : a[p[i]]); } vector<int> X_(z), Y_(z); for (int ni = 1; ni < z / 2; ni++) { X_[ni] = -ni * 2 - 1; Y_[ni] = -ni * 2; } for (int ni = 0; ni < z / 2; ni++) { X_[z - ni - 1] = v[ni * 2]; Y_[z - ni - 1] = v[ni * 2 + 1]; } for (int i = 1; i < z; i++) { X.push_back(X_[i]); Y.push_back(Y_[i]); } dfs(X, Y, -1); /*for (int x : X) cout << x << " "; cout << "\n"; for (int x : Y) cout << x << " "; cout << "\n\n";*/ vector<int> Xf, Yf, f(z); int tm = -1; for (int i = 0; i < z - 1; i++) { if (X[i] == -1 && Y[i] == -1) continue; f[i] = tm; tm--; } /*for (int i = 0; i < z; i++) { cout << f[i] << " "; } cout << "\n\n";*/ for (int i = 0; i < z; i++) { if (X[i] == -1 && Y[i] == -1) continue; Xf.push_back(X[i] < 0 ? f[-X[i] - 1] : X[i]); Yf.push_back(Y[i] < 0 ? f[-Y[i] - 1] : Y[i]); } /*for (int x : Xf) cout << x << " "; cout << "\n"; for (int x : Yf) cout << x << " "; cout << "\n";*/ answer(C, Xf, Yf); }
#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...