Submission #868710

#TimeUsernameProblemLanguageResultExecution timeMemory
868710alexddXoractive (IZhO19_xoractive)C++17
88 / 100
5 ms1112 KiB
#include "interactive.h"
#include<bits/stdc++.h>
using namespace std;
vector<int> ans;
int cate,maxd;
int le[405];
int ri[405];
int niv[405];
vector<int> aux[20];
vector<int> rez[20];
map<int,int> tori[20];
void divide_init(int st, int dr, int depth, int nod)
{
    cate=max(cate,nod);
    maxd=max(maxd,depth);
    le[nod]=st;
    ri[nod]=dr;
    niv[nod]=depth;
    if(st==dr)
        return;
    int mij=(st+dr)/2;
    divide_init(st,mij,depth+1,nod*2);
    divide_init(mij+1,dr,depth+1,nod*2+1);
}
void divide_final(int nod, vector<int> vals)
{
    /*cout<<nod<<"   "<<le[nod]<<" "<<ri[nod]<<": ";
    for(auto x:vals)
        cout<<x<<" ";
    cout<<"\n";*/
    if(le[nod]==ri[nod])
    {
        ans[le[nod]-1] = vals[0]^ans[0];
        return;
    }
    vector<int> vals_le;
    vector<int> vals_ri;
    for(auto x:vals)
    {
        if(tori[niv[nod]+1][x]>0)
            vals_ri.push_back(x);
        else
            vals_le.push_back(x);
    }
    divide_final(nod*2,vals_le);
    divide_final(nod*2+1,vals_ri);
}
vector<int> guess(int n)
{
    ans.resize(n);
	ans[0]=ask(1);
	cate=1;
	maxd=0;
    divide_init(2,n,1,1);
    for(int i=1;i<=cate;i++)
    {
        if(i%2==1)
        {
            for(int j=le[i];j<=ri[i];j++)
                aux[niv[i]].push_back(j);
        }
    }
    vector<int> cv0;
    vector<int> cv1;
    for(int i=1;i<=maxd;i++)
    {
        cv0 = get_pairwise_xor(aux[i]);
        for(auto x:cv0)
            tori[i][x]--;
        aux[i].push_back(1);
        cv1 = get_pairwise_xor(aux[i]);
        for(auto x:cv1)
            tori[i][x]++;
        rez[i].clear();
        for(auto it:tori[i])
            for(int j=0;j<it.second/2;j++)
                rez[i].push_back(it.first);
    }
    divide_final(1,rez[1]);
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...