#include "toxic.h"
#include<vector>
#include<algorithm>
#include<iostream>
#include<chrono>
#include<random>
using namespace std;
const int k = 16;
void determine_type(int n){
	auto seed = chrono::high_resolution_clock::now().time_since_epoch().count();
	mt19937_64 mt(seed);
	vector<int> vec(n), ans(n + 1, -1), good;
	for(int i = 0; i < n; i++) vec[i] = i + 1;
	shuffle(vec.begin(), vec.end(), mt);
	int tox;
	while(!vec.empty()){
		int sz = min((int)vec.size(), k);
		vector<int> ask;
		for(int i = 0; i < sz; i++){
			ask.push_back(vec[i]);
		}
		int res = query_sample(ask);
		if(res == (int)ask.size()){
			for(int i = 0; i < sz; i++) good.push_back(vec[i]);
			for(int i = 0; i < sz; i++) vec.erase(vec.begin());
			continue;
		}
		vector<int> cur;
		for(int i = sz - 1; i >= 0; i--){
			cur.push_back(vec[i]);
		}
		reverse(cur.begin(), cur.end());
		sz = (int)cur.size();
		int l = 0, r = sz - 1;
		while(l < r){
			vector<int>().swap(ask);
			int mid = (l + r) >> 1;
			for(int i = 0; i <= mid; i++) ask.push_back(cur[i]);
			if(query_sample(ask) == (int)ask.size()) l = mid + 1;
			else r = mid;
		}
		for(int i = 0; i < l; i++) good.push_back(vec[i]);
		ans[cur[l]] = 2;
		tox = cur[l];
		for(int i = 0; i <= l; i++) vec.erase(vec.begin());
	}
	while(!good.empty()){
		int sz = min((int)good.size(), 8);
		vector<int> ask;
		for(int i = 0; i < sz; i++){
			for(int j = 0; j < (1 << i); j++) ask.push_back(good[i]);
		}
		ask.push_back(tox);
		int res = query_sample(ask);
		for(int i = 0; i < sz; i++){
			if(res & (1 << i)) ans[good[i]] = 1;
			else ans[good[i]] = 0;
		}
		for(int i = 0; i < sz; i++) good.erase(good.begin());
	}
	//for(int i = 1; i <= n; i++) cout << ans[i] << " ";
	for(int i = 1; i <= n; i++) answer_type(i, char('R' + ans[i]));
}
// g++ -std=c++20 -Wall -Wextra -Wshadow -fsanitize=undefined -fsanitize=address -o run toxic.cpp stub.cpp
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |