제출 #941194

#제출 시각아이디문제언어결과실행 시간메모리
941194WanWan추월 (IOI23_overtaking)C++17
65 / 100
3558 ms26696 KiB
#include "overtaking.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long 
#ifdef LOCAL
void debug_out() {cerr<<endl;}
template <typename Head, typename... Tail>
void debug_out(Head _H, Tail... _T) {cerr<<" "<<to_string(_H);debug_out(_T...);}
#define debug(...) cerr<<"["<<#__VA_ARGS__<<"]:",debug_out(__VA_ARGS__)
#else
#define debug(...)
#endif
const int MAXN = 1005;
const int inf=1000000500ll;
const long long oo =1000000000000000500ll;
const int MOD = (int)1e9+7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef pair<int,int> pi; 
int T[MAXN][MAXN];
int n;
int m;
int xt;
vector<int32_t>S;
vector<pi> nxt[MAXN]; // nxt[t] -> {time at this station, time at next station}
void init(int32_t L, int32_t n, std::vector<long long> tt, std::vector<int32_t> W, int32_t X, int32_t m, std::vector<int32_t> S)
{
    ::S=S;
    xt=X;
    ::n=n;
    ::m=m;
    // compute arrival times of each bus at each station
    for(int x=0;x<n;x++){
        T[x][0]=tt[x];
    }
    for(int t=1;t<m;t++){
        vector<pi> vec;
        for(int x=0;x<n;x++){
            vec.push_back({T[x][t-1],x});
        }
        sort(vec.begin(),vec.end());
        int idx=0;
        int mx=0;
        for(int x=0;x<n;x++){
            int xidx=vec[x].second;
            while(idx<n && vec[idx].first<T[xidx][t-1]){
                int idxidx=vec[idx].second;
                int exp=T[idxidx][t-1] + (int)W[idxidx] * (int)(S[t]-S[t-1]);
                mx=max(mx,exp);
                ++idx;
            }
            int ex=T[xidx][t-1] + (int)W[xidx] * (int)(S[t]-S[t-1]);
            T[xidx][t]=max(mx,ex);
        }
    }
    for(int t=0;t<m-1;t++){
        for(int x=0;x<n;x++){
            nxt[t].push_back({T[x][t],T[x][t+1]});
        }
        sort(nxt[t].begin(),nxt[t].end(),[](pi x, pi y){
            if(x.first != y.first)return x.first <y.first;
            else return x.second>y.second;//we only want to keep the biggest next of the same timing
        });
        bool need[n+5];memset(need,0,sizeof need);
        int mx=-oo;
        for(int x=0;x<n;x++){
            if(nxt[t][x].second > mx){
                mx=nxt[t][x].second;
                need[x]=1;
            }
        }
        vector<pi>res;
        for(int x=0;x<n;x++){
            if(need[x])res.push_back(nxt[t][x]);
        }
        nxt[t]=res;
    }

}

long long arrival_time(long long Y)
{

    for(int t=1;t<m;t++){
        int exp=Y + xt * (int)(S[t]-S[t-1]);
        auto it=lower_bound(nxt[t-1].begin(),nxt[t-1].end(),make_pair(Y,-oo));
        if(it != nxt[t-1].begin()){
            exp=max(exp,prev(it)->second);
        }
        Y=exp;
    }
    return Y;
}
#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...