Submission #901291

# Submission time Handle Problem Language Result Execution time Memory
901291 2024-01-09T09:23:33 Z abcvuitunggio Shortcut (IOI16_shortcut) C++17
Compilation error
0 ms 0 KB
#include "shortcut.h"
#include <bits/stdc++.h>
using namespace std;
const long long INF=1e18;
const int mxn=300001;
struct T{
    long long x=-INF,y=INF;
}st[mxn*20];
long long s[mxn],d[mxn];
int id,idx[mxn],root[mxn],le[mxn*20],ri[mxn*20];
vector <long long> v;
T operator +(T a, T b){
    return {max(a.x,b.x),min(a.y,b.y)};
}
int update(int node, int l, int r, int i){
    id++;
    if (l==r){
        st[id]={s[l]+d[l],s[l]-d[l]};
        return id;
    }
    int cur=id,mid=(l+r)>>1;
    st[cur]=st[node];
    le[cur]=le[node];
    ri[cur]=ri[node];
    if (mid<i)
        ri[cur]=update(ri[node],mid+1,r,i);
    else
        le[cur]=update(le[node],l,mid,i);
    st[cur]=st[le[cur]]+st[ri[cur]];
    return cur;
}
T get(int node, int l, int r, int u, int v){
    if (l>v||r<u||l>r||u>v)
        return {-INF,INF};
    if (l>=u&&r<=v)
        return st[node];
    int mid=(l+r)>>1;
    return get(le[node],l,mid,u,v)+get(ri[node],mid+1,r,u,v);
}
long long find_shortcut(int n, vector <int> l, vector <int> D, int c){
    long long lo=0,hi=INF,kq=-1;
    for (int i=0;i<n;i++)
        d[i]=D[i];
    for (int i=1;i<n;i++){
        s[i]=s[i-1]+l[i-1];
        v.push_back(s[i]);
    }
    sort(v.begin(),v.end());
    iota(idx,idx+n,0);
    sort(idx,idx+n,[](int i, int j){return s[i]+d[i]>s[j]+d[j];});
    for (int i=0;i<n;i++)
        root[i]=update((i?root[i-1]:0),0,n-1,idx[i]);
    while (lo<=hi){
        long long mid=(lo+hi)>>1,ch=0,mnx=-INF,mxx=INF,mny=-INF,mxy=INF;
        for (int i=0;i<n;i++){
            int l=0,r=n-1,pos=-1;
            while (l<=r){
                int m=(l+r)>>1;
                if (s[idx[m]]+d[idx[m]]>mid+s[i]-d[i]){
                    pos=m;
                    l=m+1;
                }
                else
                    r=m-1;
            }
            T t=get(root[pos],0,n-1,i+1,n-1);
            mnx=max(mnx,s[i]+d[i]+c-mid+t.x);
            mxx=min(mxx,s[i]-d[i]-c+mid+t.y);
            mny=max(mny,s[i]+d[i]+c-mid-t.y);
            mxy=min(mxy,s[i]-d[i]-c+mid-t.x);
        }
        for (int i=0;i<n;i++){
            long long l=max(mnx-s[i],s[i]-mxy),r=min(mxx-s[i],s[i]-mny);
            int x=lower_bound(v.begin(),v.end(),l)-v.begin(),y=upper_bound(v.begin(),v.end(),r)-v.begin()-1;
            if (x<=y)
                ch=1;
        }
        if (ch){
            kq=mid;
            hi=mid-1;
        }
        else
            lo=mid+1;
    }
    return kq;
}

Compilation message

Compilation timeout while compiling shortcut