Submission #1201170

#TimeUsernameProblemLanguageResultExecution timeMemory
1201170The_SamuraiFinding Routers (IOI20_routers)C++20
100 / 100
44 ms592 KiB
#include "routers.h" #include "bits/stdc++.h" using namespace std; map<int, int> mp; int ask(int x) { if (mp.count(x)) return mp[x]; return mp[x] = use_detector(x); } std::vector<int> find_routers(int l, int n, int q) { vector<tuple<int, int, int>> v; vector<bool> used(n); int last = 0; for (int i = 0; i < n - 1; i++) { set<int> st; for (auto it: mp) { if (it.first >= last) st.insert(it.second); } int exp; if (st.size() == n - i) { for (auto it: mp) { if (it.first < last) continue; exp = it.second; break; } } else exp = i == 0 ? 0 : ask(last); int lx = last + 1, rx = l - (n - i - 1), best = last; for (auto it: mp) { if (it.second == exp) lx = it.first + 1; if (it.first < last or it.second == exp) continue; rx = it.first - 1; break; } best = lx - 1; while (lx <= rx) { int mid = (lx + rx) >> 1; if (ask(mid) == exp) { best = mid; lx = mid + 1; } else { rx = mid - 1; } } used[exp] = true; v.emplace_back(exp, last, best); last = best + 1; } for (int i = 0; i < n; i++) { if (!used[i]) v.emplace_back(i, last, l); } vector<int> ans(n); for (int i = 1; i < n; i++) { auto [a, b] = make_pair(get<0>(v[i - 1]), get<0>(v[i])); int start = ans[a], mid = get<2>(v[i - 1]); // cout << a << ' ' << b << ' ' << start << ' ' << mid << endl; if (a > b) mid++; ans[b] = mid + (mid - start); // cout << '\t' << ans[b] << endl; } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...