Submission #228101

#TimeUsernameProblemLanguageResultExecution timeMemory
228101monus1042Cave (IOI13_cave)C++17
100 / 100
458 ms632 KiB
#include "cave.h"
#include <bits/stdc++.h>
using namespace std;

const int MAXS = 5001;
int sw[MAXS], opens[MAXS], definedcomb[MAXS];

void funfun(int l, int r, int color, int currdoor)
{
	// base case:
	if (l==r){
		definedcomb[r]=color;
		opens[r]=currdoor;
		return;
	}
	
	// general case:
	int mid=(l+r)/2;
	for (int i=l; i<=mid; i++)
		if (definedcomb[i]==-1)
			sw[i]=color;

	int complement=color ^ 1;
	for (int i=mid+1; i<=r; i++)
		if (definedcomb[i]==-1)
			sw[i]=complement;

	int temp=tryCombination(sw);
	if (temp!=currdoor){
		funfun(l, mid, color, currdoor);
	}else{
		for(int i=l; i<=mid; i++)
			if (definedcomb[i]==-1)
				sw[i]=complement;

		for (int i=mid+1; i<=r; i++)
			if (definedcomb[i]==-1)
				sw[i]=color;

		funfun(mid+1, r, color, currdoor);
	}
}

void exploreCave(int N)
{
	memset(opens, -1, sizeof opens);
	memset(definedcomb, -1, sizeof definedcomb);
	int n=N;
	
	for (int i=0; i<n; i++){ //find out the switch of the ith door
		memset(sw, 0, sizeof sw);
		for (int j=0; j<n; j++)
			if (definedcomb[j]!=-1)
				sw[j]=definedcomb[j];

		int temp=tryCombination(sw);
		if (temp!=i){
			//ok this opens the door
			funfun(0, n-1, 0, i);
		}else{
			for (int j=0; j<n; j++){
				if (definedcomb[j]==-1) sw[j]=1;
				else sw[j]=definedcomb[j];
			}
			funfun(0, n-1, 1, i);
		}
	}
	answer(definedcomb, opens);
}
#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...