Submission #541151

#TimeUsernameProblemLanguageResultExecution timeMemory
541151MilosMilutinovicMechanical Doll (IOI18_doll)C++14
53 / 100
852 ms14980 KiB
#include "doll.h" #include <bits/stdc++.h> using namespace std; void create_circuit(int m, vector<int> a) { int n = a.size(); vector<vector<int>> nxt(m + 1); for (int i = 0; i + 1 < n; i++) { nxt[a[i]].push_back(a[i + 1]); } nxt[0].push_back(a[0]); nxt[a.back()].push_back(0); vector<int> ans(m + 1); vector<int> x; vector<int> y; int idx = 0; for (int i = 0; i <= m; i++) { if (nxt[i].empty()) { ans[i] = 0; continue; } if (nxt[i].size() == 1) { ans[i] = nxt[i][0]; continue; } vector<int> vec = nxt[i]; int pw = 1; while (pw < (int) vec.size()) pw *= 2; reverse(vec.begin(), vec.end()); while ((int) vec.size() < pw) vec.push_back(-1); reverse(vec.begin(), vec.end()); vector<int> order(pw); iota(order.begin(), order.end(), 0); sort(order.begin(), order.end(), [&](int i, int j) { int ni = 0, nj = 0; for (int b = 0; b < 30; b++) { if (i >> b & 1) { ni += (1 << (30 - b)); } if (j >> b & 1) { nj += (1 << (30 - b)); } } return ni < nj; }); auto tmp = vec; for (int i = 0; i < pw; i++) { vec[i] = tmp[order[i]]; } --idx; ans[i] = idx; vector<pair<int, int>> que; que.push_back({0, pw - 1}); for (int b = 0; b < (int) que.size(); b++) { int l = que[b].first; int r = que[b].second; if (l + 1 == r) { x.push_back(vec[l] == -1 ? ans[i] : vec[l]); y.push_back(vec[r] == -1 ? ans[i] : vec[r]); continue; } int mid = l + r >> 1; --idx; x.push_back(idx); --idx; y.push_back(idx); que.push_back({l, mid}); que.push_back({mid + 1, r}); } } answer(ans, x, y); }

Compilation message (stderr)

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:63:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   63 |       int mid = l + r >> 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...