#include "toxic.h"
#include<bits/stdc++.h>
using namespace std;
#define IOS cin.tie(nullptr)->sync_with_stdio(0),cin.exceptions(cin.failbit);
#define lb(x) (x)&-(x)
#define all(x) (x).begin(),(x).end()
#define ll long long
constexpr int blk = 8;
void determine_type(int n){
mt19937 rng(time(0));
int toxic;
vector<int> idx(n),nottoxic,isstrong(n+1),istoxic(n+1);
iota(all(idx),1);
shuffle(all(idx),rng);
int l0 = 0,r0 = n;
for(;l0+1<r0;){
int mid=l0+r0>>1;
if(query_sample(vector(idx.begin(),idx.begin()+mid))==mid)l0=mid;
else r0=mid;
}
istoxic[toxic = idx[l0]]=1;
idx.erase(idx.begin()+l0);
for(;!idx.empty();){
int R = min((int)idx.size(),blk);
vector<int> ask(1,toxic);
for(int cnt = 0,k = 0;k<R;k++,cnt++){
for(int j = 0;j<1<<cnt;j++)ask.emplace_back(idx[k]);
}
int ret = query_sample(ask);
ask.clear();
for(int k = R;k--;){
if(ret>>k&1)isstrong[idx[k]] = 1,idx.erase(idx.begin()+k);
else ask.emplace_back(idx[k]);
}
reverse(all(ask));
int l = 0,r = ask.size();
if(!ask.size()||query_sample(ask))l=ask.size()-1;
else {
for(;l+1<r;){
int mid=l+r>>1;
if(query_sample(vector(ask.begin(),ask.begin()+mid)))l=mid;
else r=mid;
}
istoxic[ask[l]]=1;
}
for(;l>=0;l--)idx.erase(idx.begin());
}
for(int i = 1;i<=n;i++){
if(istoxic[i])answer_type(i,'T');
else if(isstrong[i])answer_type(i,'S');
else answer_type(i,'R');
}
}
// g++ -DEVAL -std=gnu++17 -O2 -pipe -static -s -o toxic stub.cpp toxic.cpp
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |