Submission #1185202

#TimeUsernameProblemLanguageResultExecution timeMemory
1185202NotLinuxToxic Gene (NOI23_toxic)C++20
42.12 / 100
7 ms496 KiB
#include "toxic.h"
#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
void determine_type(int n){
	int perm[n];
	vector<int>ans(n+1,-1);
	iota(perm , perm + n , 1);
	shuffle(perm , perm + n , rng);
	int kalan = 31;
	for(int i = 0;i<n;){
		int BSZ = (n-i+kalan-1)/kalan;
		if(__builtin_popcount(BSZ) != 1)BSZ = 1 << (__lg(BSZ) + 1);
		// cout << "NOLUO " << i << " : " << BSZ << endl;
		vector<int>vec;
		for(int j = i;j<min(n , i+BSZ);j++){
			vec.push_back(perm[j]);
		}
		while(query_sample(vec) != vec.size()){
			int l = 0 , r = vec.size()-1;
			while(l < r){
				int mid = (l + r) / 2;
				vector<int>bruh;
				for(int k = l;k<=mid;k++)
					bruh.push_back(vec[k]);
				if(query_sample(bruh) != bruh.size())r = mid;
				else l = mid+1;
			}
			ans[vec[l]] = 1;
			kalan--;
			vec.erase(vec.begin() + l);
		}
		i += BSZ;
	}
	int toxic = -1;
	for(int i = 1;i<=n;i++)
		if(ans[i] == 1)
			toxic = i;
	vector<int>v;
	for(int i = 0;i<n;i++)
		if(ans[perm[i]] == -1)
			v.push_back(perm[i]);
	shuffle(v.begin() , v.end() , rng);
	for(int i = 0;i<v.size();i+=8){
		vector<int>vec;
		for(int j = 0;j<8;j++){
			if(i+j>=v.size())continue;
			int tmp = 1 << j;
			while(tmp--)vec.push_back(v[i+j]);
		}
		vec.push_back(toxic);
		int cevap = query_sample(vec);
		for(int j = 0;j<8;j++){
			if(i+j<v.size() and (cevap & (1 << j)))
				ans[v[i+j]] = 2;
		}
	}
	for(int i = 1;i<=n;i++)
		if(ans[i] == -1)
			ans[i] = 0;
	
	for(int i = 1;i<=n;i++){
		if(ans[i] == 0){
			answer_type(i,'R');
			// cout << "R";
		}
		else if(ans[i] == 1){
			answer_type(i,'T');
			// cout << "T";
		}
		else {
			answer_type(i,'S');
			// cout << "S";
		}
	}
	// cout << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...