이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "overtaking.h"
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 2000;
const int MAX_M = 2000;
const long long INF = 1e18;
struct bus {
long long t;
int v;
int p;
};
struct answer {
long long l, r, ans;
};
int n, m, x;
bus buses[MAX_N + 1], b[MAX_M][MAX_N + 1];
int s[MAX_M];
vector<long long> times;
vector<answer> ans;
long long query( long long y ) {
for ( int j = 0; j < m - 1; j++ ) {
int l = -1, r = n;
while ( r - l > 1 ) {
int mid = (l + r) / 2;
if ( b[j][mid].t < y )
l = mid;
else
r = mid;
}
y = y + (long long)x * (s[j + 1] - s[j]);
if ( l >= 0 )
y = max( y, b[j + 1][l].t );
}
return y;
}
void init( int L, int N, vector<long long> T, vector<int> W, int X, int M, vector<int> S ) {
n = N;
m = M;
x = X;
for ( int i = 0; i < n; i++ )
buses[i] = { T[i], W[i], i };
for ( int i = 0; i < m; i++ )
s[i] = S[i];
for ( int i = 0; i < n; i++ )
b[0][i] = buses[i];
for( int j = 0; j < m - 1; j++ ) {
sort( b[j], b[j] + n, []( bus a, bus b ) {
if ( a.t == b.t )
return a.v < b.v;
return a.t < b.t;
} );
for ( int i = 0; i < n; i++ )
b[j + 1][i] = b[j][i];
for ( int i = 0; i < n; i++ )
b[j + 1][i].t = b[j][i].t + (long long)b[j][i].v * (s[j + 1] - s[j]);
for ( int i = 1; i < n; i++ )
b[j + 1][i].t = max( b[j + 1][i].t, b[j + 1][i - 1].t );
}
for ( int j = 0; j < m; j++ ) {
for ( int i = 0; i < n; i++ ) {
if ( b[j][i].v > x )
times.push_back( b[j][i].t - (long long)x * s[j] );
}
}
times.push_back( 0 );
times.push_back( INF );
sort( times.begin(), times.end() );
times.resize( unique( times.begin(), times.end() ) - times.begin() );
for ( int i = 0; i < times.size() - 1; i++ ) {
if ( times[i + 1] - times[i] == 1 )
ans.push_back( { times[i], times[i], query( i ) } );
else {
if ( query( times[i] ) == query( times[i] + 1 ) )
ans.push_back( { times[i], times[i + 1] - 1, query( times[i]) } );
}
}
}
long long arrival_time( long long y ) {
long long l = 0, r = ans.size();
while ( r - l > 1 ) {
long long mid = (l + r) / 2;
if ( ans[mid].l <= y )
l = mid;
else
r = mid;
}
if ( y <= ans[l].r )
return ans[l].ans;
return y + (long long)x * s[m - 1];
}
컴파일 시 표준 에러 (stderr) 메시지
overtaking.cpp: In function 'void init(int, int, std::vector<long long int>, std::vector<int>, int, int, std::vector<int>)':
overtaking.cpp:81:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
81 | for ( int i = 0; i < times.size() - 1; i++ ) {
| ~~^~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |