Submission #1241487

#TimeUsernameProblemLanguageResultExecution timeMemory
1241487SalihSahinOvertaking (IOI23_overtaking)C++20
65 / 100
3594 ms39704 KiB
#include "bits/stdc++.h"
#include "overtaking.h"
#define pb push_back
using namespace std;

const int MAXN = 1e3 + 5;
const long long inf = 2e18;

vector<vector<long long> > t(MAXN, vector<long long>(MAXN));
vector<pair<long long, long long> > veclist[MAXN];
vector<int> s;
int n, m, x;

void init(int L, int N, vector<long long> T, vector<int> W, int X, int M, vector<int> S){
   for(int i = 0; i < N; i++){
      t[i][0] = T[i];
   }

   for(int j = 1; j < M; j++){
      vector<long long> ep(N);
      for(int i = 0; i < N; i++){
         ep[i] = t[i][j-1] + (long long)(W[i]) * (long long)(S[j] - S[j-1]);
      }
      vector<pair<long long, long long> > vec;
      for(int i = 0; i < N; i++){
         vec.pb({t[i][j-1], ep[i]});
      }
      sort(vec.begin(), vec.end());
      for(int i = 1; i < vec.size(); i++){
         vec[i].second = max(vec[i].second, vec[i-1].second);
      }

      veclist[j] = vec;

      for(int i = 0; i < N; i++){
         long long mval = ep[i];
         if(vec[0].first < t[i][j-1]){
            int l = 0, r = N-1;
            while(l < r){
               int mid = (l + r + 1)/2;

               if(vec[mid].first >= t[i][j-1]) r = mid - 1;
               else l = mid;
            }
            t[i][j] = max(vec[l].second, ep[i]);
         }
         else{
            t[i][j] = ep[i];
         }
         /*
         for(int cek = 0; cek < N; cek++){
            if(t[cek][j-1] < t[i][j-1]){
               mval = max(mval, ep[cek]);
            }
         }
         t[i][j] = mval;
         */
      }

   }

   s = S;
   n = N;
   m = M;
   x = X;

}

long long arrival_time(long long Y){
   vector<long long> myt(m);
   myt[0] = Y;
   for(int j = 1; j < m; j++){
      long long mval = myt[j-1] + (long long)(x) * (long long)(s[j] - s[j-1]);

      if(myt[j-1] <= veclist[j][0].first){
         myt[j] = mval;
      }
      else{
         int l = 0, r = n-1;
         while(l < r){
            int mid = (l + r + 1)/2;

            if(veclist[j][mid].first >= myt[j-1]) r = mid - 1;
            else l = mid;
         }
         myt[j] = max(mval, veclist[j][l].second);
      }
      /*
      for(int cek = 0; cek < n; cek++){
         if(t[cek][j-1] < myt[j-1]){
            mval = max(mval, t[cek][j]);
         }
      }
      myt[j] = mval;
      */
   }

   return myt[m-1];
}
#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...