이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "gap.h"
#include <bits/stdc++.h>
using namespace std;
long long findGap(int type, int n) {
constexpr long long C = 1e18;
if (type == 1) {
vector<long long> a(n);
int idx_l = 0, idx_r = n - 1;
long long l = 0, r = C;
for (int t = 0; t < (n + 1) / 2; t++) {
MinMax(l, r, &a[idx_l], &a[idx_r]);
l = a[idx_l] + 1;
r = a[idx_r] - 1;
idx_l++;
idx_r--;
}
long long ans = 0;
for (int i = 0; i + 1 < n; i++) {
ans = max(ans, a[i + 1] - a[i]);
}
return ans;
} else {
long long x;
long long last;
MinMax(0, C, &x, &last);
long long ans = (last - x) / (n - 1);
while (last - x > ans) {
long long mn, mx;
MinMax(x + 1, x + ans, &mn, &mx);
if (mn == -1) {
break;
} else {
x = mx;
}
}
while (last - x > ans) {
// with x, find some d such that [x, x + d] is only x, and [x + d + 1, x + d + 1 + d] is none empty and is (mn, mx)
// update ans with mn - x, and set new x to mx
// jump x until [x + ans] is only x
while (last - x > ans) {
// assert( [x, x + ans] is only x)
long long s = x + ans + 1;
assert(s <= C);
long long mn, mx;
MinMax(s, s + ans, &mn, &mx);
if (mn == -1) {
ans = ans + ans + 1;
} else {
ans = mn - x;
x = mx;
break;
}
}
while (last - x > ans) {
long long mn, mx;
MinMax(x + 1, x + ans, &mn, &mx);
if (mn == -1) {
break;
} else {
x = mx;
}
}
}
return ans;
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |