제출 #231012

#제출 시각아이디문제언어결과실행 시간메모리
231012peijar동굴 (IOI13_cave)C++17
100 / 100
321 ms760 KiB
#include <bits/stdc++.h>
#include "cave.h"
using namespace std;

#define SZ(v) ((int)(v).size())

//void answer(int S[], int D[]);
//int tryCombination(int S[]);

void exploreCave(int nb_portes)
{
	int switches[nb_portes], portes[nb_portes];
	for (int i(0); i < nb_portes; ++i)
		switches[i] = 0;
	vector<bool> fixed(nb_portes);
	int lst_ans(tryCombination(switches));
	if (lst_ans == -1)
		lst_ans = nb_portes;

	auto flip_range = [&](int left, int right)
	{
		for (int i(left); i <= right; ++i)
			if (!fixed[i])
				switches[i] ^= 1;
	};

	for (int i(0); i < nb_portes; ++i)
	{
		int lft(0), rgt(nb_portes-1);
		while (lft < rgt)
		{
			int mid = (lft + rgt)/2;
			flip_range(lft, mid);
			int nxt_ans = tryCombination(switches);
			if (nxt_ans == -1)
				nxt_ans = nb_portes;
			flip_range(lft, mid);
			if ((lst_ans <= i and nxt_ans > i) or (lst_ans > i and nxt_ans <= i))
				rgt = mid;
			else
				lft = mid+1;
		}
		assert(!fixed[lft]);
		if (lst_ans <= i)
		{
			switches[lft] ^= 1;
			lst_ans = tryCombination(switches);
			if (lst_ans == -1)
				lst_ans = nb_portes;
		}
		fixed[lft] = true;
		portes[lft] = i;
		assert(lst_ans > i);
	}
	answer(switches, portes);
}
#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...