제출 #1043258

#제출 시각아이디문제언어결과실행 시간메모리
1043258yanb자동 인형 (IOI18_doll)C++14
82.60 / 100
93 ms20388 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_circuit6(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); } void create_circuit3(int k, vector<int> a) { int n = a.size(); a.push_back(0); vector<vector<int>> g(k + 1); g[0].push_back(a[0]); for (int i = 0; i < n; i++) { g[a[i]].push_back(a[i + 1]); } vector<int> C(k + 1), X, Y; C[0] = g[0][0]; for (int j = 1; j < k + 1; j++) { int cnt = g[j].size(); int z = 1, ord = 0; while (z < cnt) { z *= 2; ord++; } if (ord == 0) { if (cnt == 1) C[j] = g[j][0]; continue; } 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)); } } int wnots = X.size(); C[j] = -wnots - 1; vector<int> v(z, -wnots - 1); for (int i = z - (int) g[j].size(); i < z; i++) { v[i] = g[j][i - z + (int) g[j].size()]; } vector<int> vp(z); for (int i = 0; i < z; i++) { vp[p[i]] = v[i]; } vector<int> X_(z), Y_(z); for (int ni = 1; ni < z / 2; ni++) { X_[ni] = -ni * 2 - wnots; Y_[ni] = -ni * 2 - 1 - wnots; } for (int ni = 0; ni < z / 2; ni++) { X_[ni + z / 2] = vp[ni * 2]; Y_[ni + z / 2] = vp[ni * 2 + 1]; } for (int i = 1; i < z; i++) { X.push_back(X_[i]); Y.push_back(Y_[i]); } } answer(C, X, Y); } void create_circuit(int k, vector<int> a) { map<int, int> freq; for (int x : a) { freq[x]++; } for (auto [_, cnt] : freq) { if (cnt > 4) { create_circuit6(k, a); return; } } create_circuit3(k, a); }

컴파일 시 표준 에러 (stderr) 메시지

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:177:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  177 |  for (auto [_, cnt] : freq) {
      |            ^
#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...