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 "gap.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
using namespace std;
mt19937 mt(2);
void check_max(ll &a, ll b){ a = (b > a) ? b : a; }
const ll INF = 1e18;
int t, n;
ll solve_1(){
ll l, r, ans = 0;
MinMax(0, INF, &l, &r);
ll l2, r2;
n -= 2;
while(n > 0){
MinMax(l + 1, r - 1, &l2, &r2);
ans = max(ans, max(l2 - l, r - r2));
l = l2, r = r2;
n -= 2;
}
ans = max(ans, r - l);
return ans;
}
ll solve(ll l, ll r, int cnt, ll curr_mx){
if(r - l <= curr_mx) return 0;
ll mid = (l + r) >> 1, l2, r2, l3, r3;
MinMax(l + 1, mid, &l2, &r2);
MinMax(mid + 1, r - 1, &l3, &r3);
if(l2 == -1 && l3 == -1) return r - l;
if(l2 != -1) curr_mx = max(l2 - l, curr_mx);
else curr_mx = max(l3 - l, curr_mx);
if(r3 != -1) curr_mx = max(r - r3, curr_mx);
else curr_mx = max(r - r2, curr_mx);
if(l2 != -1 && l3 != -1) curr_mx = max(l3 - r2, curr_mx);
if(mt() & 1){
if(l2 != -1) check_max(curr_mx, solve(l2, r2, -1, curr_mx));
if(l3 != -1) check_max(curr_mx, solve(l3, r3, -1, curr_mx));
}
else{
if(l3 != -1) check_max(curr_mx, solve(l3, r3, -1, curr_mx));
if(l2 != -1) check_max(curr_mx, solve(l2, r2, -1, curr_mx));
}
return curr_mx;
}
ll findGap(int _t, int _n){
t = _t, n = _n;
if(t == 1) return solve_1();
if(n <= 1) return 0;
ll l, r;
MinMax(0, INF, &l, &r);
ll curr_mx = ((r - l) / (n - 1)) + !!((r - l) % (n - 1));
return max(solve(l, r, n - 2, curr_mx), curr_mx);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |