Submission #436193

#TimeUsernameProblemLanguageResultExecution timeMemory
436193AmineTrabelsiLibrary (JOI18_library)C++14
19 / 100
1053 ms1044 KiB
#include <cstdio>
#include <bits/stdc++.h>
#include "library.h"
using namespace std;

void Solve(int N){
	vector<int> M(N);
	vector<int> res(N);
	vector<deque<int>> curr;
	vector<bool> rem;
	curr.push_back({1});
	rem.push_back(0);
	int prev = 1;
	M[0] = 1;
	for(int i=2;i<=N;i++){
		//cerr << i<<": \n";
		// insert book
		M[i-1] = 1;
		int q = Query(M);
		if(q > prev){
			//cerr << i<<": \n";
			curr.push_back({i}); // new group
			rem.push_back(0);
			prev = q;
		}else{
			cerr << i<<": "<<q<<"\n";
			// consider storing tables
			vector<int> side;
			for(int c=0;c<(int)curr.size();c++){
				if(rem[c])continue;
				cerr << c <<'\n';
				vector<int> m(N);
				m[i-1] = 1;
				for(auto cc:curr[c])m[cc-1] = 1;
				if(Query(m) == 1)side.push_back(c);
			}
			
			for(auto s:side)cerr<<s<<" ";
				cerr<<'\n';
			// insert into first side
			vector<int> m(N);
			m[i-1] = 1;
			for(auto cc:curr[side[0]])m[cc-1] = 1;
				
				for(auto j:curr[side[0]]){
				cerr << j<<" ";
				
			}cerr<<'\n';
			bool pos = 0; // the insertion for next side
			if(curr[side[0]].size() > 1){
				m[curr[side[0]].back()-1] = 0;
				int q = Query(m);
				m[curr[side[0]].back()-1] = 1;
				if(q == 1){
					curr[side[0]].push_front(i);
				}else{
					pos = 1;
					curr[side[0]].push_back(i);
				}
			}else{
				curr[side[0]].push_front(i);
			}
			
			for(auto j:curr[side[0]]){
				cerr << j<<" ";
			}cerr<<'\n';
			
			// if theres another side merge
			if((int)side.size() == 2){
				curr.push_back(deque<int>());
				rem.push_back(0);
				rem[side[1]] = 1;
				rem[side[0]] = 1;
				int c = curr[side[1]].front(),d = curr[side[1]].back();
				if(pos){
					m[c-1] = 1;
					q = Query(m);
					for(auto cc:curr[side[0]])curr.back().push_back(cc);
					if(q == 1){
						for(auto cc:curr[side[1]])curr.back().push_back(cc);
					}else 
						{
						reverse(curr[side[1]].begin(),curr[side[1]].end());
						for(auto cc:curr[side[1]])curr.back().push_back(cc);
						}
				}else{
					m[d-1] = 1;
					q = Query(m);
					if(q == 1){
						for(auto cc:curr[side[1]])curr.back().push_back(cc);
						for(auto cc:curr[side[0]])curr.back().push_back(cc);
					}else{
						reverse(curr[side[1]].begin(),curr[side[1]].end());
						for(auto cc:curr[side[1]])curr.back().push_back(cc);
						for(auto cc:curr[side[0]])curr.back().push_back(cc);
					}
				}
				prev--;
			}
		}
		
		for(int c=0;c<(int)curr.size();c++){
			if(!rem[c])
			for(auto j:curr[c]){
				cerr << j<<" ";
			}
			cerr << '\n';
		}
	}
	res = vector<int>(curr.back().begin(),curr.back().end());
	Answer(res);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...