Submission #1240078

#TimeUsernameProblemLanguageResultExecution timeMemory
1240078nikulidPrisoner Challenge (IOI22_prison)C++20
65 / 100
7 ms1096 KiB
#include "prison.h"
#include <assert.h>
#include <vector>
#include <iostream>

using namespace std;
bool debug=0;

#define derr if(debug)cerr
#define pb push_back

vector<vector<int>> devise_strategy(int N) {
	vector<vector<int>> answer;
	vector<int> cur(N+1,0);
	int ri;
	
	cur[0]=0; // inspect box A!
	for(int i=1; i<N+1; i++){
		if(i <= 4096){
			cur[i] = 1;
		} else{
			cur[i] = 2;
		}
	}
	answer.pb(cur);


	bool lastbox = 0;

	int pmod = 8192;
	int mod = 4096;
	int nexti = 1;

	while(pmod>4){
		/*
		basically zoom in:
		
		1       m     p    1             m
		|---I---|--I--| => |---I---|--I--|
					   M     P
		*/
		
		nexti += 2;

		cur[0] = !lastbox;
		// lastbox was in lower region
		for(int i=1; i<N+1; i++){
			ri = ((i-1)%pmod)+1;
			if(ri <= mod){ // same zone
				if(((ri-1)%mod)+1 <= mod/2){
					cur[i] = nexti;
				} else{
					cur[i] = nexti+1;
				}
			} else{ // this box is greater.
				cur[i] = ((lastbox+1)*-1);
			}
		}
		answer.pb(cur);
		// lastbox was in higher region
		for(int i=1; i<N+1; i++){
			ri = ((i-1)%pmod)+1;
			if(ri <= mod){ // this box is lesser
				cur[i] = ((!lastbox+1)*-1);
			} else{ // same zone
				if(((ri-1)%mod)+1 <= mod/2){
					cur[i] = nexti;
				} else{
					cur[i] = nexti+1;
				}			
			}
		}
		answer.pb(cur);
		
		lastbox = !lastbox;
		pmod/=2;
		mod/=2;

	} 
	// pmod=4, mod=2
	
	// now we must explore box A.
	cur[0] = 0;
	// (24) valB is in the lower zone (1-2 MOD 4)
	for(int i=1; i<N+1; i++){
		ri = ((i-1)%pmod)+1;
		if(ri>1) cur[i]=-2;
		else cur[i]=-1;
	}
	answer.pb(cur);
	// (25) valB in the upper zone (3-4 MOD 4)
	for(int i=1; i<N+1; i++){
		ri = ((i-1)%pmod)+1;
		if(ri<4) cur[i]=-1;
		else cur[i]=-2; // <-- !
	}
	answer.pb(cur);

	derr<<"answer.size() >> "<<answer.size()<<"\n";
	derr<<"previous box: "<<lastbox<<"\n";
	derr<<"we know the answer %"<<pmod<<" is between 1 "<<mod<<"\n";
	return answer;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...