Submission #101270

#TimeUsernameProblemLanguageResultExecution timeMemory
101270ae04071Gap (APIO16_gap)C++11
30 / 100
78 ms1276 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 = 3;
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 {
        lli pr = l;
        for(int i=0;i<SEG;i++) {
            lli s = pr+1, t=pr+1+(r-l)/SEG+1;
            if(s>=r) break;
            if(t>=r) t=r-1;
            
            pll tmp = dfs(s, t);
            if(tmp.fi!=-1) {
                mx = max(mx, tmp.fi-l);
                pr=tmp.se;
            }
        }
        mx = max(mx, r-pr);
        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...