제출 #863040

#제출 시각아이디문제언어결과실행 시간메모리
863040faustaadp추월 (IOI23_overtaking)C++17
0 / 100
2 ms12892 KiB
#include "overtaking.h" #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll> pll; #define pb push_back #define mp make_pair #define fi first #define se second const ll NN = 2e5 + 5; ll n, m, x; ll a[NN], b[NN], jar[NN], sam[2020][2020]; vector<pair<ll, pll> > v[NN]; vector<ll> hai; vector<pll> oi; long long arrival_timee(long long Y); 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; for(ll i = 0; i < n; i++) { a[i] = T[i]; b[i] = W[i]; // cout << a[i] << "dan" << b[i] << "ui\n"; } for(ll i = 0; i < m; i++) jar[i] = S[i]; for(ll i = 0; i < n; i++) sam[0][i] = a[i]; for(ll i = 1; i < m; i++) { for(ll j = 0; j < n; j++) { v[i].pb(mp(sam[i - 1][j], mp(b[j], j))); } sort(v[i].begin(), v[i].end()); ll lst = 0; for(auto z : v[i]) { sam[i][z.se.se] = max(lst, sam[i - 1][z.se.se] + (jar[i] - jar[i - 1]) * z.se.fi); lst = sam[i][z.se.se]; } } ll lst = 0; for(ll i = 1; i <= N * 2; i++) { ll o = arrival_timee(lst); ll L = lst, R = 1e18, kan = lst; while(L <= R) { ll C = (L + R) / 2; if(arrival_timee(C) == o) { kan = C; L = C + 1; } else R = C - 1; } // cout << kan << " " << o << "\n"; oi.pb(mp(kan, o)); lst = kan + 1; } // for(ll i = 0; i <= 500; i++) { // if(i == 0 || arrival_time(i) != arrival_time(i - 1)) // cout << i << " " << arrival_time(i) << "\n"; } return; } long long arrival_timee(long long Y) { for(ll i = 1; i < m; i++) { pair<ll, pll> ban = mp(Y, mp(x, n)); ll L = 0, R = v[i].size() - 1; ll lst = -1; while(L <= R) { ll C = (L + R) / 2; if(v[i][C] < ban) { lst = C; L = C + 1; } else R = C - 1; } if(lst >= 0) Y = max(sam[i][v[i][lst].se.se], Y + (jar[i] - jar[i - 1]) * ban.se.fi); else Y = Y + (jar[i] - jar[i - 1]) * ban.se.fi; // sort(v.begin(), v.end()); // ll lst = 0; // for(auto z : v) // { // // cout << "(" << i << "," << z.fi << ") " << sam[z.se.se] << " + " << (jar[i] - jar[i - 1]) << "*" << z.se.fi << "@\n"; // sam[z.se.se] = max(lst, sam[z.se.se] + (jar[i] - jar[i - 1]) * z.se.fi); // lst = sam[z.se.se]; // } } return Y; } long long arrival_time(long long Y) { if(oi.back().fi < Y) return oi.back().se + Y - oi.back().fi; ll ret = 0, L = 0, R = oi.size() - 1; while(L <= R) { ll C = (L + R) / 2; if(oi[C].fi >= Y) { ret = oi[C].se; R = C - 1; } else L = C + 1; } return ret; }
#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...