#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)*114514);
int toxic;
vector<int> idx(n+1),nottoxic,isstrong(n+1),istoxic(n+1);
iota(all(idx),0);
shuffle(idx.begin()+1,idx.end(),rng);
auto chk = [&](auto self,int l,int r) -> void {
for(int i = 1;i<=n;){
vector<int> ask;
for(int cnt = 0,k = i;cnt<blk&&k<=n;k++,cnt++){
for(int j = 0;j<1<<cnt;j++)ask.emplace_back(idx[k]);
}
int ret = query_sample(ask);
if(query_sample(ask)!=ask.size()){
for(;i<r;i++,ret>>=1){
if(ret&1)isstrong[idx[i]] = 1;
else if(!query_sample({idx[i]}))istoxic[toxic=idx[i]]=1;
}
}
else {
for(;i<r;i++)nottoxic.emplace_back(idx[i]);
}
}
};
chk(chk,1,n+1);
for(int i = 0;i<nottoxic.size();){
vector<int> ask(1,toxic);
for(int cnt = 0,k = i;cnt<8&&k<nottoxic.size();k++,cnt++){
for(int j = 0;j<1<<cnt;j++)ask.emplace_back(nottoxic[k]);
}
int ret = query_sample(ask);
for(int cnt = 0;cnt<8&&i<nottoxic.size();i++,cnt++,ret>>=1){
isstrong[nottoxic[i]] = ret&1;
}
}
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');
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |