Submission #1065698

#TimeUsernameProblemLanguageResultExecution timeMemory
1065698cpdreamerOvertaking (IOI23_overtaking)C++17
39 / 100
3551 ms15964 KiB
#include "overtaking.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#define V vector
#define F first
#define pb push_back
#define all(v) v.begin(),v.end()
using namespace std;
typedef long long ll;
struct bus{
    ll departure;
    ll speed;
};
bus A[(int)2000];
V<int>stat(2000);
int l,n,m,x;
void init(int L, int N, std::vector<long long> T, std::vector<int> W, int X, int M, std::vector<int> S)
{
    for(int i=0;i<N;i++){
        A[i].departure=T[i];
        A[i].speed=W[i];
    }
    l=L,n=N,m=M,x=X;
    for(int i=0;i<M;i++){
        stat[i]=S[i];
    }

}
struct tim{
    ll expected;
    ll arrival;
};
bool sorted( tim a,  tim b){
    return a.arrival<b.arrival;
}
long long arrival_time(long long Y)
{
    A[n]={Y,x};
    tim stations[m][n+1];
    V<tim>precedor(n+1);
    for(int i=0;i<=n;i++) {
        stations[0][i].arrival = A[i].departure;
        precedor[i].arrival=stations[0][i].arrival;
    }

    for(int i=1;i<m;i++){
        for(int j=0;j<=n;j++){
            stations[i][j].expected=stations[i-1][j].arrival+(stat[i]-stat[i-1])*A[j].speed;
            precedor[j].expected=stations[i][j].expected;
        }
        sort(all(precedor),sorted);
        ll maximum[n+1];
        maximum[0]=precedor[0].expected;
        for(int j=1;j<=n;j++){
            maximum[j]=max(maximum[j-1],precedor[j].expected);
        }
        for(int j=0;j<=n;j++){
            ll comp=stations[i-1][j].arrival;
            int left=0,right=n;
            int ans=-1;
            while(left<=right){
                int middle=(left+right)/2;
                if(precedor[middle].arrival<comp){
                    ans=middle;
                    left=middle+1;
                }
                else
                    right=middle-1;
            }
            if(ans!=-1)
                stations[i][j].arrival=max(maximum[ans],stations[i][j].expected);
            else
                stations[i][j].arrival=stations[i][j].expected;
        }
        for(int j=0;j<=n;j++){
            precedor[j].arrival=stations[i][j].arrival;
        }
    }
    return stations[m-1][n].arrival;
}
#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...