Submission #1241385

#TimeUsernameProblemLanguageResultExecution timeMemory
1241385noyancanturkOvertaking (IOI23_overtaking)C++20
65 / 100
3593 ms14916 KiB
#include "overtaking.h"

#include<bits/stdc++.h>
using namespace std;

const int lim=1100;

using mint=long long;
using pii=pair<mint,mint>;

mint dp[lim][lim];

int n,m,x;

vector<mint>t;
vector<int>w,s;
int p[lim][lim];

void init(int L,int N,vector<mint>T,vector<int>W,int X,int M,vector<int> S)
{   
  n=N,m=M,x=X;
  t=T,w=W,s=S;
  for(int i=0;i<n;i++){
    dp[0][i]=t[i];
  }
  for(int i=0;i+1<m;i++){
    iota(p[i],p[i]+n,0);
    sort(p[i],p[i]+n,[&](int i1,int i2)->bool {
      if(dp[i][i1]^dp[i][i2])return dp[i][i1]<dp[i][i2];
      return w[i1]<w[i2];
    });
    for(int j=0;j<n;j++){
      dp[i+1][j]=dp[i][j]+1ll*w[j]*(s[i+1]-s[i]);
    }
    for(int j=1;j<n;j++){
      dp[i+1][p[i][j]]=max(dp[i+1][p[i][j]],dp[i+1][p[i][j-1]]);
    }
  }
  // for(int i=0;i<n;i++){
  //   for(int j=0;j<m;j++){
  //     cerr<<dp[j][i]<<' ';
  //   }cerr<<'\n';
  // }cerr<<'\n';
  return;
}

mint arrival_time(mint y)
{
  for(int i=0;i+1<m;i++){
    int l=0,r=n-1,res=-1;
    while(l<=r){
      int mid=l+r>>1;
      if(y==dp[i][p[i][mid]]){
        if(w[p[i][mid]]<x){
          l=mid+1;
          res=mid;
        }else{
          r=mid-1;
        }
      }else if(dp[i][p[i][mid]]<y){
        l=mid+1;
        res=mid;
      }else{
        r=mid-1;
      }
    }
    y+=1ll*x*(s[i+1]-s[i]);
    if(res!=-1){
      y=max(y,dp[i+1][p[i][res]]);
    }
  }
  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...