제출 #1333955

#제출 시각아이디문제언어결과실행 시간메모리
1333955nguyenLibrary (JOI18_library)C++20
0 / 100
13 ms436 KiB
#include <cstdio>
#include <vector>

#include "library.h"
using namespace std;
pair<int,int> adj[1005];
void Solve(int N)
{
	
	for(int i = 0; i < N; i++) adj[i].first = adj[i].second = -1;
	for(int i = 0; i < N; i++)
	{
		int lo = 0, hi = N-1, except = -1, fin = -1;
		if(adj[i].second != -1) continue;
		if(adj[i].first != -1) except = adj[i].first;
		while(lo <= hi)
		{
			int x = (lo+hi)/2;
			vector<int> m1(N, 0);
			int cnt = 0;
			
			for(int j = lo; j <= x; j++) if(j != except) m1[j] = 1, cnt++;
			m1[i] = 0;
			if(i <= x && i >= lo) cnt--;
			
			int mcount = 0;
			if(cnt == 0) mcount = -1;
			else mcount = Query(m1);
			
			m1[i] = 1;
			int mafter = Query(m1);
			
			if(mafter <= mcount) 
			{
				fin = x;
				hi = x-1;
			}
			else lo = x+1;
		}
		if(fin != -1)
		{
			if(adj[i].first != -1) adj[i].second = fin;
			else adj[i].first = fin;
			
			if(adj[fin].first != -1) adj[fin].second = i;
			else adj[fin].first = i;
			
			
		}
	}
	vector<int> res;
	int start = 0;
	for(int i = 0; i < N; i++)
	{
		if(adj[i].second == -1)
		{
			start = i;
			break;
		}
	}
	vector<bool> answered(N,false);
	while(res.size() < N)
	{
		res.push_back(start+1);
		answered[start] = true;
		int prev = start;
		start = adj[start].first;
		if(answered[start]) start = adj[prev].second;
	}
	Answer(res);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...