Submission #101268

#TimeUsernameProblemLanguageResultExecution timeMemory
101268ae04071Gap (APIO16_gap)C++11
42.89 / 100
91 ms1272 KiB
#include "gap.h"
#include <bits/stdc++.h>
#define fi first
#define se second
#define sz(x) ((int)(x).size())
using namespace std;
using lli=long long;
using pll=pair<lli,lli>;

const lli INF=1000000000000000000ll;

lli sub1(int n) {
    lli mx=0, lv=-1, rv=INF+1;
    for(int i=0;i<(n+1)/2;i++) {
        lli s=lv, t=rv, l, r;
        MinMax(s+1, t-1, &l, &r);
        if(i!=0) {
            mx = max(mx, l-lv);
            mx = max(mx, rv-r);
        }
        lv = l; rv = r;
    }
    if(!(n&1)) mx = max(mx, rv-lv);
    return mx;
}
lli mx=0;
int SEG = 2;
pll dfs(lli lv,lli rv) {
    if(lv>rv) return pll(-1,-1);
    lli s=lv, t=rv, l,r;
    MinMax(s,t,&l,&r);
    if(l==-1) return pll(-1, -1);
    else if(l==r) return pll(l,l);
    else {
        pll lt = dfs(l+1, (l+r)/2);
        pll rt = dfs((l+r)/2+1, r-1);
        
        if(lt.fi!=-1) {
            mx = max(mx, lt.fi-l);
        } else if(rt.fi!=-1) {
            mx = max(mx, rt.fi-l);
        } else mx = max(mx, r-l);

        if(rt.se!=-1) mx = max(mx,r-rt.se);
        else if(lt.se!=-1) mx = max(mx, r-lt.se);
        else mx = max(mx, (r-l));
        
        if(lt.se!=-1 && rt.fi!=-1) mx = max(mx, rt.fi-lt.se);
        return pll(l, r);
    }
}
lli sub2(int n) {
    dfs(0, INF);
    return mx;
}

long long findGap(int T, int N)
{
    mx=0;

    if(N<=10 || T==1) return sub1(N);
    else return sub2(N);
    
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...