This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "prize.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma optimize
using namespace std;
const int M = 2e5 + 10;
vector<int> r;
pair<int, int> A[M];
tuple<int, int, int, int> Q[M << 2];
inline pair<int, int> doAsk(int i) {
if (A[i].first != -1) {
return A[i];
}
r = ask(i);
return A[i] = { r[0], r[1] };
}
int find_best(int n) {
for (int i = 0; i < n; i++) {
A[i].first = -1;
}
vector<int> I(n), J;
for (int i = 0; i < n; i++) {
I[i] = i;
}
int c = 0;
while (I.size() != 1) {
if (++c > 5) {
exit(-1);
}
int x = 0;
for (int j = 0; j < min((int)I.size(), (int)sqrt(I.size()) + 20); j++) {
auto [a, b] = doAsk(I[j]);
x = max(x, a + b);
}
int p = 0;
Q[p++] = { 0, 0, 0, (int)I.size() - 1 };
while (p != 0) {
auto [l, r, lo, hi] = Q[--p];
if (lo == hi) {
J.push_back(I[lo]);
continue;
}
int m = lo + hi >> 1;
auto [vl, vr] = doAsk(I[m]);
int c = 0, off = 0, ll = m, rr = m;
while (vl + vr != x) {
J.push_back(I[m + off]);
c += 1;
if (off <= 0) {
off = -off + 1;
rr = m + off;
}
else {
off = -off;
ll = m + off;
}
if (m + off < lo || m + off > hi) {
break;
}
auto [nl, nr] = doAsk(I[m + off]);
vl = nl; vr = nr;
}
if (m + off < lo || m + off > hi) {
continue;
}
if (off <= 0) {
if (l + vr != x) Q[p++] = { l, vr, lo, m + off };
if (vl + c + r != x) Q[p++] = { vl + c, r, m - off + 1, hi };
}
else {
if (l + vr + c != x) Q[p++] = { l, vr + c, lo, m - off };
if (vl + r != x) Q[p++] = { vl, r, m + off, hi };
}
}
I = J; J.clear();
sort(I.begin(), I.end());
}
return I[0];
}
Compilation message (stderr)
prize.cpp:7: warning: ignoring '#pragma optimize ' [-Wunknown-pragmas]
7 | #pragma optimize
|
prize.cpp: In function 'int find_best(int)':
prize.cpp:52:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
52 | int m = lo + hi >> 1;
| ~~~^~~~
prize.cpp:55:24: warning: variable 'll' set but not used [-Wunused-but-set-variable]
55 | int c = 0, off = 0, ll = m, rr = m;
| ^~
prize.cpp:55:32: warning: variable 'rr' set but not used [-Wunused-but-set-variable]
55 | int c = 0, off = 0, ll = m, rr = m;
| ^~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |