# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1210177 | thangdz2k7 | 추월 (IOI23_overtaking) | C++20 | 0 ms | 0 KiB |
#include "overtaking.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAX = 1e3;
long long n, m, x;
long long timer[MAX][MAX], ans[MAX][MAX], f[MAX];
pair <long long, long long> buses[MAX];
vector <long long> s;
void init(long long L, long long N, vector <ll> T, vector <long long> W, long long X, long long M, vector <long long> S){
n = 0, m = M, x = X;
s = S;
for (int i = 0; i < m; ++ i)
f[i] = x * s[i];
for (long long i = 0; i < N; ++ i) if (W[i] > X)
buses[n ++] = make_pair(T[i], W[i]);
if (n == 0) return;
sort(buses, buses + n);
for (long long i = 0; i < n; ++ i)
timer[0][i] = buses[i].first;
for (long long i = 1; i < m; ++ i){
for (long long j = 0; j < n; ++ j){
buses[j].first += (S[i] - S[i - 1]) * buses[j].second;
if (j) buses[j].first = max(buses[j].first, buses[j - 1].first);
}
sort(buses, buses + n);
for (long long j = 0; j < n; ++ j)
timer[i][j] = buses[j].first;
}
for (long long i = 0; i < n; ++ i)
ans[m - 1][i] = timer[m - 1][i];
for (long long i = m - 2; i >= 0; -- i){
ans[i][0] = timer[i][0] + (s[m - 1] - s[i]) * x;
for (long long j = 1; j < n; ++ j){
if (timer[i][j] == timer[i][j - 1]){
ans[i][j] = ans[i][j - 1];
continue;
}
long long tmp = timer[i][j] + (s[m - 1] - s[i]) * x;
if (tmp >= timer[m - 1][j - 1]){
ans[i][j] = tmp;
continue;
}
long long low = i + 1, high = m - 1;
while (low < high){
long long mid = low + high >> 1;
long long tmp = timer[i][j] + (s[mid] - s[i]) * x;
if (tmp <= timer[mid][j - 1]) high = mid;
else low = mid + 1;
}
ans[i][j] = ans[low][j - 1];
}
}
}
long long arrival_time(long long Y){
long long tmp = Y + f[m - 1];
if (n == 0 || Y <= timer[0][0])
return tmp;
long long low = 1, high = n;
while (low < high){
long long mid = low + high >> 1;
if (timer[0][mid] >= Y) high = mid;
else low = mid + 1;
}
long long i = low - 1;
if (timer[m - 1][i] <= tmp) return tmp;
low = 1, high = m - 1;
while (low < high){
long long mid = low + high >> 1;
long long tmp = Y + f[mid];
if (tmp <= timer[mid][i]) high = mid;
else low = mid + 1;
}
return ans[low][i];
}