Submission #941052

#TimeUsernameProblemLanguageResultExecution timeMemory
941052bachhoangxuanToxic Gene (NOI23_toxic)C++17
93.25 / 100
28 ms748 KiB
#include "toxic.h"
#include<bits/stdc++.h>
using namespace std;
mt19937_64 rng(69420);

vector<int> toxic;
void reset(){
    toxic.clear();
}
void add(int x,int cnt){
    for(int i=0;i<cnt;i++) toxic.push_back(x);
}
int ask(){
    return query_sample(toxic);
}

void determine_type(int n){
	vector<int> p(n);
    vector<char> c(n+1);
    iota(p.begin(),p.end(),1);
    //reverse(p.begin(),p.end());
    vector<int> all;
    int T=0;
    while(!p.empty()){
        shuffle(p.begin(),p.end(),rng);
        vector<int> cur;
        for(int i=0;i<8;i++){
            if(p.empty()) break;
            cur.push_back(p.back());
            p.pop_back();
        }
        reset();
        int sz=(int)cur.size();
        for(int i=0;i<sz;i++) add(cur[i],(1<<i));
        int total=ask();
        /*
        cout << (int)cur.size() << '\n';
        for(int x:cur) cout << x << ' ';
        cout << total << '\n';
        */
        if(total==(1<<sz)-1) all.insert(all.end(),cur.begin(),cur.end());
        else{
            for(int i=sz-1;i>=0;i--){
                if((total>>i)&1){
                    c[cur[i]]='S';
                    cur.erase(cur.begin()+i);
                }
            }
            sz=(int)cur.size();
            int l=0,r=sz-2,pos=sz-1;
            while(l<=r){
                int mid=(l+r)>>1;reset();
                for(int i=0;i<=mid;i++) add(cur[i],1<<i);

                int num=mid+1;
                vector<int> nxt;
                //cout << "all " << (int)all.size() << '\n';
                while(!all.empty() && num+(int)nxt.size()<8){
                    add(all.back(),1<<(num+(int)nxt.size()));
                    nxt.push_back(all.back());all.pop_back();
                }

                int cnt=ask(),real_cnt=cnt&((1<<num)-1);
                if(!real_cnt){
                    for(int i=0;i<(int)nxt.size();i++){
                        if(cnt>>(num+i)&1) c[nxt[i]]='S';
                        else c[nxt[i]]='R';
                    }
                }
                else all.insert(all.end(),nxt.begin(),nxt.end());
                cnt=real_cnt;
                //cout << "cnt " << cnt << '\n';
                if(cnt==0) pos=mid,r=mid-1;
                else l=mid+1;
            }

            //cout << '*' << pos << '\n';

            T=cur[pos];
            c[cur[pos]]='T';
            cur.erase(cur.begin()+pos);
            for(int i=pos-1;i>=0;i--){
                c[cur[i]]='R';
                cur.erase(cur.begin()+i);
            }
            p.insert(p.begin(),cur.begin(),cur.end());
        }
    }
    while(!all.empty()){
        vector<int> cur;
        for(int i=0;i<8;i++){
            if(all.empty()) break;
            cur.push_back(all.back());
            all.pop_back();
        }
        reset();
        add(T,1);
        int sz=(int)cur.size();
        for(int i=0;i<sz;i++) add(cur[i],(1<<i));
        int total=ask();
        for(int i=sz-1;i>=0;i--){
            if(total>>i&1) c[cur[i]]='S';
            else c[cur[i]]='R';
        }
    }
    //for(int i=1;i<=n;i++) cout << c[i];
    //cout << '\n';
    for(int i=1;i<=n;i++) answer_type(i,c[i]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...