제출 #1118033

#제출 시각아이디문제언어결과실행 시간메모리
11180330pt1mus23Swimming competition (LMIO18_plaukimo_varzybos)C++14
0 / 100
2076 ms108880 KiB
// Ali - OVERKILLL BABE 

// #pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define int long long int
#define ins insert      
#define pii pair<int,int>
#define pb push_back
#define endl '\n'
#define putr(x) cout<<x<<endl;return; 
#define all(x) x.begin(),x.end()
const int mod = 1e9 +7, sze = 1e6+23, inf = 2e9, LG = 19,pr = 31;

struct ups{
    vector<int> T;
    ups(int n){
        T.resize(n*4 +23,inf);
    }
    void upd(int node,int idx,int l,int r,int v){
        if(l==r){
            T[node]=v;
            return;
        }
        int mid = (l+r)/2;
        if(idx<=mid){
            upd(2*node,idx,l,mid,v);
        }
        else{
            upd(2*node +1,idx,mid+1,r,v);
        }
        T[node]=min(T[2*node],T[2*node +1]);
    }
    int qry(int node,int lx,int rx,int l,int r){
        if(lx>rx){
            return inf;
        }
        if(l>rx || r<lx){
            return inf;
        }
        if(l>=lx && r<=rx){
            return T[node];
        }
        int mid= (l+r)/2;

        return min(
            qry(2*node,lx,rx,l,mid),
            qry(2*node +1,lx,rx,mid+1,r)
        );
    }
};

struct upsmax{
    vector<int> T;
    upsmax(int n){
        T.resize(n*4 +23,-inf);
    }
    void upd(int node,int idx,int l,int r,int v){
        if(l==r){
            T[node]=v;
            return;
        }
        int mid = (l+r)/2;
        if(idx<=mid){
            upd(2*node,idx,l,mid,v);
        }
        else{
            upd(2*node +1,idx,mid+1,r,v);
        }
        T[node]=max(T[2*node],T[2*node +1]);
    }
    int qry(int node,int lx,int rx,int l,int r){
        if(lx>rx){
            return -inf;
        }
        if(l>rx || r<lx){
            return -inf;
        }
        // cout<<lx<<" "<<rx<<" "<<l<<" "<<r<<endl;
        if(l>=lx && r<=rx){
            return T[node];
        }
        int mid= (l+r)/2;
        return max(
            qry(2*node,lx,rx,l,mid),
            qry(2*node +1,lx,rx,mid+1,r)
        );
    }
};

void fast(){
    int n,a,b;
    cin>>n>>a>>b;   
    vector<int> arr(n);
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
    sort(all(arr));
    int lx=0;
    int rx =2e9;
    int ans=0;
    ups mins(n+23);
    upsmax maxs(n+23);
    for(int i=0;i<n;i++){
        mins.upd(1,i,0,n-1,arr[i]);
        maxs.upd(1,i,0,n-1,arr[i]);
    }
    // cout<<maxs.qry(1,0,3,0,n-1)<<endl;
    while(lx<=rx){
        ups dp(n+23);

        int mid = (lx+rx)/2;
        // cout<<lx<<" "<<rx<<" --- "<<mid<<endl;
        dp.upd(1, a-1, 0,n-1, maxs.qry(1,0,a-1,0,n-1) - mins.qry(1,0,a-1,0,n-1) );
        // cout<<maxs.qry(1,0,a-1,0,n-1) - mins.qry(1,0,a-1,0,n-1)<<endl;
        for(int i=a;i<n;i++){

            int r = max((int)0,i - a +1);
            int l = max((int)0,i-b +1);
            int z = inf;
            // cout<<mid<<" "<<l<<" "<<r<<" "<<i<<endl;
            // cout<<maxs.qry(1,l,i,0,n-1)- mins.qry(1,l,i,0,n-1)<<endl;
            while(l<=r){
                // cout<<mid<< " "<<l<<" "<<r<<endl;
                int m = (l+r)/2;
                if( maxs.qry(1,m,i,0,n-1) - mins.qry(1,m,i,0,n-1) <= mid ){
                    r = m-1;
                    z = m;
                }
                else{
                    l = m+1;
                }
            }
            // cout<<mid<<" "<<i<<" "<<z<<endl;
            if(z!=inf){
                int x = dp.qry(1,max((int)0,z-1),max((int)0,i-a),0,n-1);
                // cout<<i<<" => "<<x<<endl;
                dp.upd(1,i,0,n-1,x);
            }
        }
        // cout<<mid<<" ............ "<<dp.qry(1,n-1,n-1,0,n-1)<<endl;
        if(dp.qry(1,n-1,n-1,0,n-1) <= mid){
            rx = mid-1;
            ans = mid;
        }
        else{
            lx = mid+1;
        }
    }

    putr(ans);
}

 
signed main(){
    // ios::sync_with_stdio(0);
    // cin.tie(0);
    // cout.tie(0);
 
    int tt = 1;
    // cin>>tt;
 
    while(tt--){
        fast();
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...