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>
using namespace std;
typedef vector<int> vi;
struct SegTree {
int n;
vi v;
void update(int i, int val)
{
int p = i + n;
v[p] = val;
while (p /= 2)
v[p] = v[2 * p] + v[2 * p + 1];
}
int query(int i, int l, int h, int ql, int qh)
{
if (h <= ql || qh <= l)
return 0;
if (l <= ql && qh <= h)
return v[i];
int m = (h - l) / 2 + l;
return query(2 * i, l, m, ql, qh) + query(2 * i + 1, m, h, ql, qh);
}
int query(int l, int h)
{
return query(1, 0, n, l, h);
}
SegTree() { }
SegTree(int sz)
{
n = 1;
while (n < sz)
n *= 2;
v = vi(2 * n + 1, 0);
}
};
int n;
SegTree st;
set<int> nl;
map<int, vi> qr;
int llc = 0;
int res = -1;
vi ask2(int i)
{
//cout << i << endl;
if (qr.count(i))
return qr[i];
qr[i] = ask(i);
return qr[i];
}
int cask(int i)
{
int p1, p2;
p1 = p2 = i;
while (nl.count(p1))
p1--;
while (nl.count(p2))
p2++;
if (p1 < 0)
i = p2;
else if (p2 >= n)
i = p1;
else if (abs(i - p1) < abs(i - p2))
i = p1;
else
i = p2;
auto p = ask2(i);
if (p[0] + p[1] == 0)
res = i;
if (p[0] + p[1] < llc) {
nl.insert(i);
st.update(i, 1);
return 2;
}
int l = p[0] - st.query(0, i);
int r = p[1] - st.query(i, n);
return l < r;
}
int find_best(int n_)
{
n = n_;
st = SegTree(n + 1);
for (int i = 0; i < min(n, 500); i++) {
auto p = ask2(i);
llc = max(llc, p[0] + p[1]);
//if (p[0] + p[1] == 0)
// return i;
}
int marp = 1000000;
while (res == -1 && marp--) {
int l = 0;
int h = n - 1;
bool found = false;
int ps = nl.size();
while (l < h - 2) {
int m = (h - l) / 2 + l;
int r = cask(m);
if (r == 2) {
if (nl.size() == ps)
res = -2;
found = true;
break;
}
if (r)
l = m - 1;
else
h = m + 1;
}
if (!found)
for (int i = l; i <= h; i++)
cask(i);
//if (nl.size() == ps)
// res = -2;
}
return res;
}
Compilation message (stderr)
prize.cpp: In function 'int find_best(int)':
prize.cpp:106:31: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
106 | if (nl.size() == ps)
| ~~~~~~~~~~^~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |