#include "shortcut.h"
#include <cassert>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
using llg = long long;
using pii = pair<llg, llg>;
const llg BIG = (llg)(1e9) * (llg)(1e7);
llg nbSta;
llg lenShortcut;
llg lenMap;
pii finAutor(llg tempsVise, llg debutShort, vector<llg> &pos, vector<llg> &poids, vector<vector<llg>> &table)
{
pii finPos {0, BIG};
llg maxAvant = -BIG;
for (llg sta = 0; sta < debutShort; ++sta) {
maxAvant = max(maxAvant, poids[sta] - pos[sta]);
int dm = poids[sta] + pos[sta] + maxAvant;
if (dm > tempsVise) return {-1, -1};
}
llg posDebut = pos[debutShort];
for (llg sta = debutShort; sta < nbSta; ++sta) {
llg risqueApres = table[sta][debutShort] - posDebut;
bool canAvant = (poids[sta] + pos[sta] + maxAvant <= tempsVise);
llg risqueAvant = posDebut + maxAvant;
if (canAvant) risqueAvant = -BIG;
if (canAvant && risqueApres < 0) continue;
llg tempsPlus = tempsVise - max(risqueApres, risqueAvant) - lenShortcut - poids[sta];
if (tempsPlus < 0) return {-1, -1};
finPos.first = max(finPos.first, pos[sta] - tempsPlus);
finPos.second = min(finPos.second, pos[sta] + tempsPlus);
}
return finPos;
}
vector<vector<llg>> genTable(llg tempsVise, vector<llg> &pos, vector<llg> &poids)
{
vector<vector<llg>> table(nbSta);
for (llg sta = 0; sta < nbSta; ++sta) {
table[sta].resize(sta+1);
table[sta][sta] = -BIG;
llg maxAutor = tempsVise - poids[sta] - pos[sta];
llg curMax = -BIG;
for (llg prev = sta-1; prev >= 0; --prev) {
llg valPrev = poids[prev] - pos[prev];
if (valPrev > maxAutor) { // Ne peut pas etre attellg direct
curMax = max(curMax, poids[prev] + pos[prev]);
}
table[sta][prev] = curMax;
}
}
return table;
}
bool estPossibleGlob(llg tempsVise, vector<llg> &pos, vector<llg> &revPos, vector<llg> &poids, vector<llg> &revPoids)
{
vector<pii> finToDebut(nbSta);
auto tabNor = genTable(tempsVise, pos, poids);
auto tabRev = genTable(tempsVise, revPos, revPoids);
for (llg sta = 0; sta < nbSta; ++sta) {
pii x = finAutor(tempsVise, sta, revPos, revPoids, tabRev);
finToDebut[sta] = {lenMap - x.second, lenMap - x.first};
}
for (llg deb = 0; deb < nbSta; ++deb) {
pii posFinOk = finAutor(tempsVise, deb, pos, poids, tabNor);
for (llg fin = deb; fin < nbSta; ++fin) {
if (posFinOk.first <= pos[fin] && pos[fin] <= posFinOk.second) {
auto corDebOk = finToDebut[fin];
if (corDebOk.first <= pos[deb] && pos[deb] <= corDebOk.second) {
return true;
}
}
}
}
return false;
}
long long find_shortcut(int _n, std::vector<int> _l, std::vector<int> _d, int _c)
{
nbSta = _n;
lenShortcut = _c;
vector<llg> pos, revPos;
vector<llg> poids, revPoids;
pos.resize(nbSta);
revPos.resize(nbSta);
poids.resize(nbSta);
revPoids.resize(nbSta);
llg curPos = 0;
for (llg iSta = 0; iSta < nbSta; ++iSta) {
pos[iSta] = curPos;
if (iSta < nbSta-1) curPos += _l[iSta];
poids[iSta] = _d[iSta];
revPoids[iSta] = _d[nbSta-1-iSta];
}
lenMap = pos.back();
curPos = 0;
for (llg iSta = nbSta-1; iSta >= 0; --iSta) {
revPos[iSta] = curPos;
if (iSta > 0) curPos += _l[iSta-1];
}
reverse(revPoids.begin(), revPoids.end());
llg lo = 1, ri = (llg)(1e9) * (llg)(3003);
while (lo < ri) {
llg mid = (lo + ri) / 2;
if (estPossibleGlob(mid, pos, revPos, poids, revPoids)) {
ri = mid;
} else {
lo = mid+1;
}
}
return lo;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
252 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
256 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
2 ms |
376 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
2 ms |
256 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
2 ms |
256 KB |
n = 2, incorrect answer: jury 62 vs contestant 71 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
252 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
256 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
2 ms |
376 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
2 ms |
256 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
2 ms |
256 KB |
n = 2, incorrect answer: jury 62 vs contestant 71 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
252 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
256 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
2 ms |
376 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
2 ms |
256 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
2 ms |
256 KB |
n = 2, incorrect answer: jury 62 vs contestant 71 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
252 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
256 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
2 ms |
376 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
2 ms |
256 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
2 ms |
256 KB |
n = 2, incorrect answer: jury 62 vs contestant 71 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
252 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
256 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
2 ms |
376 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
2 ms |
256 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
2 ms |
256 KB |
n = 2, incorrect answer: jury 62 vs contestant 71 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
252 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
256 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
2 ms |
376 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
2 ms |
256 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
2 ms |
256 KB |
n = 2, incorrect answer: jury 62 vs contestant 71 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
252 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
256 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
2 ms |
376 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
2 ms |
256 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
2 ms |
256 KB |
n = 2, incorrect answer: jury 62 vs contestant 71 |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
252 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
2 ms |
256 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
2 ms |
376 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
2 ms |
256 KB |
n = 3, 4 is a correct answer |
5 |
Incorrect |
2 ms |
256 KB |
n = 2, incorrect answer: jury 62 vs contestant 71 |
6 |
Halted |
0 ms |
0 KB |
- |