Submission #597306

#TimeUsernameProblemLanguageResultExecution timeMemory
597306Soumya1The Big Prize (IOI17_prize)C++17
99.68 / 100
55 ms5320 KiB
#include "prize.h" #include <bits/stdc++.h> using namespace std; const int S = 500; vector<vector<int>> a; int ans, mx; vector<int> query(int i) { if (a[i].size()) return a[i]; return a[i] = ask(i); } void solve(int l, int r, int pref, int suf) { if (l > r) return; if (pref + suf == mx) return; int m = (l + r) >> 1; while (m >= l) { auto g = query(m); if (g[0] + g[1] == 0) { ans = m; return; } if (g[0] + g[1] == mx) { int tot = g[0] - pref; solve(l, m - 1, pref, g[1]); break; } m--; } if (m <= l) { solve((l + r) / 2 + 1, r, query((l + r) / 2 + 1)[0], suf); } else { solve(m + 1, r, query(m)[0], suf); } } int find_best(int n) { a.resize(n); if (n <= 5000) { for (int i = 0; i < n; i++) { auto g = query(i); if (g[0] + g[1] == 0) return i; } } int who = 0; for (int i = 0; i < S; i++) { auto g = query(i); if (mx < g[0] + g[1]) { mx = g[0] + g[1]; who = i; } if (1LL * (g[0] + g[1]) * (g[0] + g[1]) > n) { who = i; break; } if (g[0] + g[1] == 0) { return i; } } int r = n - 1; while (r >= who) { auto g = query(r); if (g[0] + g[1] == 0) return r; if (g[0] + g[1] == mx) break; r--; } solve(who + 1, r - 1, query(who)[0], query(r)[1]); return ans; }

Compilation message (stderr)

prize.cpp: In function 'void solve(int, int, int, int)':
prize.cpp:22:8: warning: unused variable 'tot' [-Wunused-variable]
   22 |    int tot = g[0] - pref;
      |        ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...