제출 #256747

#제출 시각아이디문제언어결과실행 시간메모리
256747spacewalker커다란 상품 (IOI17_prize)C++14
97.67 / 100
69 ms2048 KiB
#include <bits/stdc++.h>
#include "prize.h"

using namespace std;
constexpr int NMAX = 200000;
constexpr int NORMIE_MAX = 475;

int lessLeft[NMAX];
int lessRight[NMAX];

int totalHigher = -1;

pair<int, int> query(int i) {
	if (lessLeft[i] == -1) {
		vector<int> ans = ask(i);
		lessLeft[i] = ans[0];
		lessRight[i] = ans[1];
	}
	return {lessLeft[i], lessRight[i]};
}

int higherThan(int i) {
	auto [lx, ly] = query(i);
	return lx + ly;
}

int findAllValuables(int i, int j, int valBefore, int valAfter, vector<int> &ans) {
//	printf("FNV %d %d %d %d\n", i, j, valBefore, valAfter);
	if (i > j) return -1;
	else {
		int k = (i + j) / 2;
		int nonValBefore, nonValAfter;
		for (nonValAfter = k; nonValAfter <= j && higherThan(nonValAfter) != totalHigher; ++nonValAfter) {
			if (higherThan(nonValAfter) == 0) return nonValAfter;
			ans.push_back(nonValAfter);
		}
		for (nonValBefore = k; nonValBefore >= i && higherThan(nonValBefore) != totalHigher; --nonValBefore) {
			if (higherThan(nonValBefore) == 0) return nonValBefore;
			ans.push_back(nonValBefore);
		}
		if (lessLeft[nonValBefore] != valBefore) {
			int potAns = findAllValuables(i, nonValBefore - 1, valBefore, lessRight[nonValBefore], ans);
			if (potAns != -1) return potAns;
		}
		if (lessRight[nonValAfter] != valAfter) {
			int potAns = findAllValuables(nonValAfter + 1, j, lessLeft[nonValAfter], valAfter, ans);
			if (potAns != -1) return potAns;
		}
		return -1;
	}
}

int find_best(int n) {
	memset(lessLeft, -1, sizeof lessLeft);
	memset(lessRight, -1, sizeof lessRight);
	if (n <= NORMIE_MAX) {
		for (int i = 0; i < n - 1; ++i) {
			if (higherThan(i) == 0) return i;
		}
	}
	for (int i = 0; i < NORMIE_MAX; ++i) {
		totalHigher = max(totalHigher, higherThan(i));
		if (higherThan(i) == 0) return i;
	}
	int firstNonValuable = -1;
	for (int i = 0; i < n; ++i) {
		if (higherThan(i) == totalHigher) {
			firstNonValuable = i;
			break;
		}
	}
	vector<int> vToCheck;
	for (int i = 0; i < firstNonValuable; ++i) vToCheck.push_back(i);
	int potAns = findAllValuables(firstNonValuable + 1, n - 1, query(firstNonValuable).first, 0, vToCheck);
	if (potAns != -1) return potAns;
	for (int i : vToCheck) {
		if (higherThan(i) == 0) return i;
	}
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

prize.cpp: In function 'int higherThan(int)':
prize.cpp:23:7: warning: decomposition declaration only available with -std=c++1z or -std=gnu++1z
  auto [lx, ly] = query(i);
       ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...