답안 #132221

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
132221 2019-07-18T13:58:26 Z hugo_pm Shortcut (IOI16_shortcut) C++17
0 / 100
2 ms 376 KB
#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 -