Submission #1061069

#TimeUsernameProblemLanguageResultExecution timeMemory
1061069fuad27추월 (IOI23_overtaking)C++17
100 / 100
2986 ms515108 KiB
    #include "overtaking.h"
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
     
    long long speed;
    const long long inf=1e18+10;
    vector<vector<long long>> ta;
    vector<vector<pair<long long, long long>>> pr;
    long long asdf=0;
    namespace ST {
      static const long long NN=1e6;
      static const int LG=30;
      int ndcnt=1;
      long long RR=inf;
      long long T[NN*LG], T2[NN*LG];
      long long L[NN*LG], R[NN*LG];
      void update1(long long ll, long long rr, long long val, long long l=0, long long r=0, long long v=1) {
        if(r<ll or rr<l)return;
        if(ll<=l and r<=rr) {
          T[v]=max(T[v], val);
          T2[v]=max(T2[v], T[v]);
          return;
        }
        long long mid=(l+r)/2;
        if(L[v]==0)L[v]=++ndcnt;
        if(R[v]==0)R[v]=++ndcnt;
        update1(ll, rr, val, l, mid, L[v]);
        update1(ll, rr, val, mid+1, r, R[v]);
        T2[v]=max(T2[v], max(T2[L[v]], T2[R[v]]));
      }
      long long query1(long long x, long long l, long long r, long long v) {
        if(v==0)return 0;
        long long mid=(l+r)/2;
        if(x <= mid) {
          return max(T[v], query1(x, l, mid, L[v]));
        }
        else return max(T[v], query1(x, mid+1, r, R[v]));
      }
      void update(long long l, long long r, long long val) {
        update1(l, r, val, 0, RR, 1);
      }
      long long query(long long x) {
        return max(x, query1(x, 0, RR, 1));
      }
      long long get(long long x, long long tmpval = 0, long long l=0, long long r=RR, long long v=1){
        if(v==0) {
          if(tmpval>x)return l;
          if(r>x)return x+1;
          return -1;
        }
        tmpval=max(tmpval, T[v]);
        long long mid=(l+r)/2;
        if(max(mid, max(tmpval, T2[L[v]]))>x)return get(x, tmpval, l, mid, L[v]);
        long long ttt=get(x, tmpval, mid+1, r, R[v]);
        if(ttt!=-1) {
          return ttt;
        }
        if(max(r, tmpval) > x) {
          if(tmpval>x)return l;
          return x+1;
        }
        return -1;
      }
    };
    void init(int L, int N, std::vector<long long> T, std::vector<int> W, int X, int M, std::vector<int> S) {
      speed=X;
      asdf=S.back()*speed;
      ta=vector<vector<long long>> (M, vector<long long> (N));
      for(int i = 0;i<M;i++) {
        for(int j = 0;j<N;j++) {
          if(i==0)ta[i][j]=T[j];
          else ta[i][j]=ta[i-1][j]+(long long)(S[i]-S[i-1])*W[j];
        }
        if(i){
          vector<pair<pair<long long, long long>, int>> idxx;
          for(int j = 0;j<N;j++) {
            idxx.push_back({{ta[i-1][j], ta[i][j]}, j});
          }
          sort(idxx.begin(), idxx.end());
          for(int k = 1;k<N;k++) {
            ta[i][idxx[k].second]=max(ta[i][idxx[k].second], ta[i][idxx[k-1].second]);
          }
        }
      }
      pr.resize(M);
      for(int i = 0 ;i<M;i++) {
        vector<long long> idx;
        for(int j = 0;j<N;j++) {
            ta[i][j]-=S[i]*speed;
        }
        if(i) {
          for(int j = 0;j<N;j++) {
              long long lo = 0, hi = inf;
              long long LL=ST::get(ta[i-1][j]);
              idx.push_back(LL);
          }
          for(int j = 0;j<N;j++) {
            if(idx[j]==-1)continue;
            ST::update(idx[j], (long long)inf, ta[i][j]);
          }
        }
      }
    }
     
    long long arrival_time(long long Y) {
      long long ans=ST::query(Y);
      return ans+asdf;
    }

Compilation message (stderr)

overtaking.cpp: In function 'void init(int, int, std::vector<long long int>, std::vector<int>, int, int, std::vector<int>)':
overtaking.cpp:95:25: warning: unused variable 'lo' [-Wunused-variable]
   95 |               long long lo = 0, hi = inf;
      |                         ^~
overtaking.cpp:95:33: warning: unused variable 'hi' [-Wunused-variable]
   95 |               long long lo = 0, hi = inf;
      |                                 ^~
#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...