제출 #846275

#제출 시각아이디문제언어결과실행 시간메모리
846275Mohmad_Zaid추월 (IOI23_overtaking)C++17
39 / 100
3528 ms32200 KiB
#include "overtaking.h"
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
int l,x,n,m;
vector<vector<ll>>t,e;
vector<int>w,s;
struct segtree{
    int size=1;
    vector<ll>maxs;
    void init(int n){
        while(size<n)size*=2;
        maxs.resize(2*size-1,-1);
    }
    void update(int i,ll v,int x,int lx,int rx){
        if(rx-lx==1){
            maxs[x]=v;
            return;
        }
        int mid=(lx+rx)/2;
        if(i<mid)update(i,v,2*x+1,lx,mid);
        else update(i,v,2*x+2,mid,rx);
        maxs[x]=max(maxs[2*x+1],maxs[2*x+2]);
    }
    void update(int i,ll v){
        update(i,v,0,0,size);
    }
    void get(int l,int r,int x,int lx,int rx,ll& ans){
        if(lx>=r || rx<=l)return;
        if(lx>=l && rx<=r){
            ans=max(ans,maxs[x]);
            return;
        }
        int mid=(lx+rx)/2;
        get(l,r,2*x+1,lx,mid,ans);
        get(l,r,2*x+2,mid,rx,ans);
    }
    void get(int l,int r,ll& ans){
        get(l,r,0,0,size,ans);
    }
    void print(){
        for(int i=0;i<2*size-1;i++){
            if(maxs[i]>-1)cout<<maxs[i]<<' ';
        }
        cout<<endl;
    }
};
void init(int L, int N, vector<long long> T, vector<int> W, int X, int M, vector<int> S)
{
    l=L,x=X,n=N,m=M;
    w=W,s=S;
    t.resize(n+1,vector<ll>(m));
    e.resize(n+1,vector<ll>(m));
    for(int i=0;i<n;i++){
        t[i][0]=T[i];
    }
    segtree st;
    st.init(n);
    for(int stop=1;stop<m;stop++){
        vector<pair<ll,int>>bef;
        for(int i=0;i<n;i++){
            e[i][stop]=t[i][stop-1]+((W[i]*1LL)*(S[stop]-S[stop-1]));
            bef.pb({t[i][stop-1],i});
        }
        sort(bef.begin(),bef.end());
        for(int i=0;i<n;i++){
            st.update(i,e[bef[i].second][stop]);
        }
        for(int i=0;i<n;i++){
            int l=-1,r=n;
            while(l+1<r){
                int mid=(l+r)/2;
                if(bef[mid].first<t[i][stop-1])l=mid;
                else r=mid;
            }
            ll ans=e[i][stop];
            st.get(0,r,ans);
            t[i][stop]=ans;
        }
    }
    return;
}

long long arrival_time(long long Y){
    vector<vector<ll>>T(n+1,vector<ll>(m)),E(n+1,vector<ll>(m));
    T=t,E=e;
    T[n][0]=Y;
    segtree st2;
    st2.init(n+1);
    for(int stop=1;stop<m;stop++){
        E[n][stop]=T[n][stop-1]+((x*1LL)*(s[stop]-s[stop-1]));
        vector<pair<ll,int>>bef;
        for(int i=0;i<=n;i++){
            bef.pb({T[i][stop-1],i});
        }
        sort(bef.begin(),bef.end());
        bool ok=0;
        for(int i=0;i<=n;i++){
            st2.update(i,E[bef[i].second][stop]);
            if(ok){
                for(int j=i;j<=n;j++){
                    int te=bef[j].second;
                    if(T[n][stop-1]<T[te][stop-1]){
                        // E[te][stop]=T[te][stop-1]+((w[te]*1LL)*(s[stop]-s[stop-1]));
                        T[te][stop]=max(T[te][stop],E[n][stop]);
                    }
                }
                break;
            }
            if(bef[i].second!=n)continue;
            ok=1;
            int l=-1,r=i+1;
            while(l+1<r){
                int mid=(l+r)/2;
                if(bef[mid].first<T[n][stop-1])l=mid;
                else r=mid;
            }
            ll ans=E[n][stop];
            st2.get(0,r,ans);
            T[n][stop]=ans;
        }
    }
    // cout<<"E: "<<endl;
    // for(int stop=1;stop<m;stop++){
    //     for(int i=0;i<=n;i++){
    //         cout<<E[i][stop]<<' ';
    //     }cout<<endl;
    // }
    // cout<<endl<<"T: "<<endl;
    // for(int stop=1;stop<m;stop++){
    //     for(int i=0;i<=n;i++){
    //         cout<<T[i][stop]<<' ';
    //     }cout<<endl;
    // }
    return T[n][m-1];
}
// int main(){
//     int n,l,x,m;
//     cin>>l>>n>>x>>m;
//     vector<int>s(m+1),w(n+1);
//     vector<ll>t(n+1);
//     for(int i=0;i<n;i++)cin>>t[i];
//     for(int i=0;i<n;i++)cin>>w[i];
//     for(int i=0;i<m;i++)cin>>s[i];
//     init(l,n,t,w,x,m,s);
//     cout<<arrival_time(50)<<endl;
//     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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...