Submission #623721

#TimeUsernameProblemLanguageResultExecution timeMemory
623721jophyyjhFinding Routers (IOI20_routers)C++14
96.34 / 100
6 ms1116 KiB
/** * Well, if we naively do binary search per router, the score is ~70. After that, I * was thinking if we can minimize the num. of queries by "re-using" information. * use_detector() is clearly an increasing function, so * use_detector(l) = use_detector(r) * => use_detector(l) = use_detector(l+1) = ... = use_detector(r). * This means we can do some form of caching, though its efficiency is unknown. Also, * we do not know whether the grader is adaptive, but I'm pretty sure it can reduce * the num. of queries significantly. * * Again, our task is to find the last point v with use_detector(v) = x (for each x). * First, check a point every x points, and call these checked points "initial pts". * Now, the "endpoints" we're finding must be between two initial points, so we can * do binary jump for each one of them. The num of steps is l/x + n * log_2(x). The * optimal x is 69, which yields at most 7557 steps (worst case). Good enough~ * * Steps needed: ... * Implementation 0.9 (Just for testing my way of cache) */ #include <bits/stdc++.h> #include "routers.h" typedef std::vector<int> vec; std::map<int, int> cache1; std::map<int, int, std::greater<int>> cache2; int wrap_use(int i) { auto it1 = cache1.lower_bound(i); auto it2 = cache2.lower_bound(i); if (it1 != cache1.end() && it2 != cache2.end()) { if (it1->second == it2->second) return it1->second; } int result = use_detector(i); cache1[i] = cache2[i] = result; return result; } vec find_routers(int l, int n, int q) { cache1.clear(); cache2.clear(); vec ans = {0}; for (int i = 0; i < n - 1; i++) { int prev = ans.back(); int a = prev, b = l; while (a < b) { int mid = (a + b + 1) / 2; if (wrap_use(mid) == i) a = mid; else b = mid - 1; } ans.push_back(2 * a - prev); } 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...