Submission #844769

#TimeUsernameProblemLanguageResultExecution timeMemory
844769LucaIlieOvertaking (IOI23_overtaking)C++17
0 / 100
1 ms4440 KiB
#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( b[j][i].t - (long long)x * s[j] + 1 ); times.push_back( b[j][i].t - (long long)x * s[j] - 1 ); } } } 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( times[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]; }

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:84:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   84 |     for ( int i = 0; i < times.size() - 1; i++ ) {
      |                      ~~^~~~~~~~~~~~~~~~~~
#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...