Submission #535439

#TimeUsernameProblemLanguageResultExecution timeMemory
535439mario05092929Shortcut (IOI16_shortcut)C++14
23 / 100
29 ms4472 KiB
#include "shortcut.h"
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair <ll,ll> pi;
typedef vector <int> vec;
const ll INF = 1e18;
ll p[1000005],d[1000005];
ll di,ans;
int n;
vector <pi> lad,lsu;
int adp[1000005],sup[1000005],adrp[1000005],surp[1000005];
ll ad[1000005],su[1000005];
int t[1 << 20],bit = (1 << 19);

bool cmp_ad(int x,int y) {return ad[x] < ad[y];}

void up(int x,int wi) {
    x += bit;
    t[x] = wi;
    x /= 2;
    while(x) {
        if(su[t[x]] <= su[wi]) break;
        t[x] = wi;
        x /= 2;
    }
}

int query(ll val) {
    int ret = n;
    if(ad[t[1]] > val) return t[1];
    for(int x = 1;x < bit*2;) {
        x *= 2;
        if(ad[t[x+1]] > val) {if(su[ret] > su[t[x+1]]) ret = t[x+1];}
        else x++;
    }
    return ret;
}

bool isok(ll m) {
    ll adl,adr,sul,sur;
    adl = sul = -INF;
    adr = sur = INF;
    for(int i = 1;i < bit*2;i++) t[i] = n;
    int adpo = -1;
    for(int i = n-1;i >= 0;i--) {
        ll v = m+p[i]-d[i];
        if(adpo != -1&&ad[adpo] > v) {
            int j = adpo;
            ll A = p[i], B = p[j], C = m-d[i]-d[j]-di;
            sur = min(sur,A-B+C);
            adl = max(adl,A+B-C);
            j = query(v);
            B = p[j], C = m-d[i]-d[j]-di;
            sul = max(sul,A-B-C);
            adr = min(adr,A+B+C);
            //cout << adpo << ' ' << j << '\n';
            if(adl > adr||sul > sur) return 0;
        }
        if(adpo == -1||adrp[adpo] < adrp[i]) adpo = i;
        up(adrp[i],i);
    }
    //cout << m << " : " << sul << ' ' << sur << ' ' << adl << ' ' << adr << '\n';
    int po = 0;
    for(int i = 0;i < n;i++) {
        ll x = p[i],l,r;
        l = max(adl-x,sul+x), r = min(adr-x,sur+x);
        for(;po >= 1&&p[po-1] >= l;po--);
        for(;po < n&&p[po] < l;po++);
        //cout << po << '\n';
        if(po < n&&p[po] <= r) return 1;
    }
    return 0;
}

ll find_shortcut(int N,vec len,vec dist,int gi) {
    di = gi; n = N;
    //for(bit = 1;bit <= n;bit *= 2);
    ll lm = 0,rm = -INF;
    for(int i = 0;i < n;i++) d[i] = dist[i];
    for(int i = 1;i < n;i++) p[i] = p[i-1]+len[i-1];
    for(int i = 0;i < n;i++) adp[i] = i;
    for(int i = 0;i < n;i++) {
        ad[i] = p[i]+d[i], su[i] = p[i]-d[i];
        lm = max(lm,ad[i]+rm);
        rm = max(rm,-su[i]);
    }
    ad[n] = su[n] = INF;
    sort(adp,adp+n,cmp_ad);
    sort(dist.rbegin(),dist.rend());
    for(int i = 0;i < n;i++) adrp[adp[i]] = i;
    ll l = dist[0]+dist[1], r = lm;
    while(l <= r) {
        //cout << l << ' ' << r <<'\n';
        ll mid = (l + r) >> 1;
        if(isok(mid)) r = mid-1, ans = mid;
        else l = mid+1;
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...