Submission #70410

#TimeUsernameProblemLanguageResultExecution timeMemory
70410chpipisThe Big Prize (IOI17_prize)C++11
98.06 / 100
74 ms6300 KiB
#include "prize.h" #include <bits/stdc++.h> using namespace std; typedef vector<int> vi; const int MAXN = 2e5 + 5; const int SIZE = 325; int cnt[MAXN], num_q; vi memo[MAXN]; vi query(int x) { if (memo[x].size() > 0) return memo[x]; num_q++; vi ret = ask(x); return memo[x] = ret; } int find_best(int n) { memset(cnt, 0, sizeof cnt); fill(memo, memo + n + 1, vi()); num_q = 0; /* int mx = -1; for (int i = 0, j; i < n; i = j + 1) { if (i == n - 1) return i; j = i; vi cur = query(i); if (cur[0] + cur[1] == 0) return i; if (cur[0] + cur[1] < mx) continue; mx = max(mx, cur[0] + cur[1]); int lo = i + 1, hi = n - 1; while (lo <= hi) { int mid = (lo + hi) >> 1; vi now = query(mid); if (now[0] + now[1] == 0) return mid; if (now == cur) { lo = mid + 1; j = mid; } else { hi = mid - 1; } } } */ for (int i = 0; i < n; i++) { if (i == n - 1) return i; vi cur = query(i); int type = cur[0] + cur[1]; if (type == 0) return i; cnt[type]++; if (query(i + 1) != cur) continue; int b; for (b = i / SIZE; (b + 1) * SIZE < n; b++) { vi now = query((b + 1) * SIZE); if (!(now == cur || (now[0] == cnt[type] + cur[0] && now[1] >= cur[1]))) break; cnt[now[0] + now[1]] += b * SIZE + SIZE - 1 - max(i, b * SIZE - 1); } int lo = max(i + 1, b * SIZE), hi = min(n - 1, (b + 1) * SIZE); if (i == (b + 1) * SIZE - 1) { lo = (b + 1) * SIZE; hi = min(n - 1, (b + 2) * SIZE); } int same = 0, who = type; while (lo < hi) { int mid = (lo + hi) >> 1; vi now = query(mid); if (now == cur || (now[0] == cnt[type] + cur[0] && now[1] >= cur[1])) { if (now == cur) { who = type; } else { who = now[0] + now[1]; } same = mid - i; lo = mid + 1; } else { hi = mid; } } cnt[who] += same; i = hi - 1; } }

Compilation message (stderr)

prize.cpp: In function 'int find_best(int)':
prize.cpp:88:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...