이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "prize.h"
#include <map>
#include <random>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
struct infos {
int pos, left, right;
infos(int pos_, int left_, int right_) : pos(pos_), left(left_), right(right_) {};
};
mt19937 mt(1902272037);
int rand_rng(int l, int r) {
uniform_int_distribution<int> p(l, r - 1);
return p(mt);
}
vector<int> random_pos(int n, int m) {
vector<int> ans;
for(int i = 0; i < m; ++i) {
int x = -1;
while(x == -1 || find(ans.begin(), ans.end(), x) != ans.end()) {
x = rand_rng(0, n);
}
ans.push_back(x);
}
sort(ans.begin(), ans.end());
return ans;
}
int find_best(int n) {
vector<int> samples = random_pos(n, min(n, 5));
int all = 0;
for(int i : samples) {
vector<int> res = ask(i);
all = max(all, res[0] + res[1]);
}
vector<infos> v = { infos(-1, 0, all), infos(n, all, 0) };
vector<int> s;
while(true) {
int maxd = 0, ptr = -1, mrem = -1;
for(int i = 0; i < int(v.size()) - 1; ++i) {
int rem = v[i].right + v[i + 1].left - all;
rem -= lower_bound(s.begin(), s.end(), v[i + 1].pos) - lower_bound(s.begin(), s.end(), v[i].pos);
if(rem > 0 && v[i + 1].pos - v[i].pos > maxd) {
maxd = v[i + 1].pos - v[i].pos;
ptr = i;
mrem = rem;
}
}
if(ptr == -1) break;
if(maxd >= 2) {
int m = (v[ptr].pos + v[ptr + 1].pos) / 2;
vector<int> res = ask(m);
if(res[0] + res[1] == 0) return m;
if(res[0] + res[1] == all) {
v.insert(v.begin() + ptr + 1, infos(m, res[0], res[1]));
}
else {
--mrem;
s.push_back(m);
int cm = m - 1, flag = 0;
while(mrem > 0 && cm > v[ptr].pos) {
vector<int> res2 = ask(cm);
if(res2[0] + res2[1] == 0) return cm;
if(res2[0] + res2[1] == all) {
v.insert(v.begin() + ptr + 1, infos(cm, res2[0], res2[1]));
flag = 1;
break;
}
s.push_back(cm);
--mrem;
--cm;
}
cm = m + 1;
while(mrem > 0 && cm < v[ptr + 1].pos) {
vector<int> res2 = ask(cm);
if(res2[0] + res2[1] == 0) return cm;
if(res2[0] + res2[1] == all) {
v.insert(v.begin() + ptr + 1 + flag, infos(cm, res2[0], res2[1]));
break;
}
s.push_back(cm);
--mrem;
++cm;
}
sort(s.begin(), s.end());
}
}
}
return -1;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |