Submission #844124

#TimeUsernameProblemLanguageResultExecution timeMemory
844124AndreyOvertaking (IOI23_overtaking)C++17
65 / 100
3557 ms25904 KiB
#include "overtaking.h"
#include<bits/stdc++.h>
using namespace std;

long long haha[1001][1001];
vector<pair<long long,long long>> dp[1001];
vector<long long> w(0);
long long n,m,x;
vector<long long> s(0);

void init(int L, int N, std::vector<long long> t, std::vector<int> W, int X, int M, std::vector<int> S) {
    n = N;
    m = M;
    x = X;
    vector<pair<long long, long long>> wow(0);
    for(int i = 0; i < n; i++) {
        wow.push_back({W[i],t[i]});
    }
    long long l,r;
    for(int i = 0; i < n; i++) {
        w.push_back(wow[i].first);
    }
    for(int i = 0; i < m; i++) {
        s.push_back(S[i]);
    }
    for(long long i = 0; i < n; i++) {
        haha[0][i] = wow[i].second;
    }
    for(long long i = 1; i < m; i++) {
        for(long long j = 0; j < n; j++) {
            haha[i][j] = haha[i-1][j]+(s[i]-s[i-1])*w[j];
        }
        vector<pair<long long,long long>> wut(0);
        for(int j = 0; j < n; j++) {
            wut.push_back({haha[i-1][j],haha[i][j]});
        }
        sort(wut.begin(),wut.end());
        for(int j = 1; j < n; j++) {
            wut[j] = {wut[j].first,max(wut[j].second,wut[j-1].second)};
        }
        for(long long j = 0; j < n; j++) {
            dp[i].push_back(wut[j]);
            if(haha[i-1][j] > wut[0].first) {
                l = 0;
                r = n-1;
                while(l < r) {
                    int mid = (l+r+1)/2;
                    if(wut[mid].first < haha[i-1][j]) {
                        l = mid;
                    }
                    else {
                        r = mid-1;
                    }
                }
                haha[i][j] = max(haha[i][j],wut[l].second);
            }
        }
    }
    return;
}

long long arrival_time(long long y)
{
    vector<long long> ans(m);
    ans[0] = y;
    long long l,r;
    for(long long i = 1; i < m; i++) {
        ans[i] = ans[i-1]+(s[i]-s[i-1])*x;
        l = 0;
        r = n-1;
        if(ans[i-1] > dp[i][0].first) {
            while(l < r) {
                int mid = (l+r+1)/2;
                if(dp[i][mid].first < ans[i-1]) {
                    l = mid;
                }
                else {
                    r = mid-1;
                }
            }
            ans[i] = max(ans[i],dp[i][l].second);
        }
    }
    return ans[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...