Submission #1185153

#TimeUsernameProblemLanguageResultExecution timeMemory
1185153epicci23Toxic Gene (NOI23_toxic)C++20
0 / 100
0 ms320 KiB
	#include "bits/stdc++.h"
	#include "toxic.h"
	//#define int long long
	#define all(v) v.begin() , v.end()
	#define sz(a) (int)a.size()
	using namespace std;

	mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

	int ask(vector<int> v){
	  return query_sample(v);
	}

	vector<int> Toxic;

	void determine_type(int n){
		Toxic.clear();
		
	    vector<int> Lol;
	    for(int i=1;i<=n;i++) Lol.push_back(i);
	    shuffle(all(Lol), rng);

		for(int i = 0; i < n; i += 3){

	      vector<int> Cur;
	      for(int j = i; j < i + 3; j++) Cur.push_back(Lol[j]);
	      int hm = ask(Cur);

	      if(hm < sz(Cur)){
	        bool ok = 0;

	        for(int u = 0; u < 3; u++){

	         if(ok == 0 && u == 2){
	           Toxic.push_back(Cur[u]);
	           break;
	         }

	         if(ask({Cur[u]}) == 0){
	           ok = 1;
	           Toxic.push_back(Cur[u]);
	           if(hm == 2) break;
	         }
	      
	        }

	      }
		}
	    
	    vector<int> mark(n+5,0);
	    for(int u : Toxic) mark[u] = 1;

	    vector<int> Calc;
	    for(int i=1;i<=n;i++) if(!mark[i]) Calc.push_back(i);

	    while(!Calc.empty()){
	      vector<int> Tek,Ogren;
	      Tek.push_back(Toxic[0]);

	      while(sz(Ogren) < 8 && !Calc.empty()){
	      	int cur = Calc.back();
	      	Calc.pop_back();
	      	for(int j = 0; j < (1<<(sz(Ogren))); j++) Tek.push_back(cur);
	        Ogren.push_back(cur);
	      }

	      int mask = ask(Tek);
	      for(int i = 0; i < sz(Ogren); i++) if(mask >> i & 1) mark[Ogren[i]] = 2;
	    }

	    for(int i=1;i<=n;i++){
	      if(mark[i] == 0) answer_type(i, 'R');
	      else if(mark[i] == 1) answer_type(i, 'T');
	      else answer_type(i, 'S');
	    }
	}
#Verdict Execution timeMemoryGrader output
Fetching results...