Submission #95339

#TimeUsernameProblemLanguageResultExecution timeMemory
95339dalgerokLibrary (JOI18_library)C++14
100 / 100
436 ms412 KiB
#include "library.h"
#include<bits/stdc++.h>
using namespace std;



int ask(vector < int > &V){
    return Query(V);
}

int n;

int Find(int n){
    if(n == 1){
        return 0;
    }
    vector < int > a(n);
    for(int i = 0; i < n; i++){
        a[i] = 1;
    }
    for(int i = 0; i < n; i++){
        a[i] = 0;
        if(ask(a) == 1){
            return i;
        }
        a[i] = 1;
    }
    return 0;
}

vector < int > a, b;
vector < bool > used;

int Find_next(int l, int r, vector < int > &vec){
    if(l == r){
        return vec[l];
    }
    int mid = (r + l) >> 1;
    for(int i = l; i <= mid; i++){
        a[vec[i]] = b[vec[i]] = true;
    }
    int x = ask(a), y = ask(b);
    for(int i = l; i <= mid; i++){
        a[vec[i]] = b[vec[i]] = false;
    }
    if(x == y){
        return Find_next(l, mid, vec);
    }
    else{
        return Find_next(mid + 1, r, vec);
    }
}
void Solve(int N){
    n = N;
    a.resize(n, 0);
    b.resize(n, 0);
    used.resize(n, false);
    vector < int > ans(n);
    int pos = Find(n);
    a[pos] = 1;
    ans[0] = pos + 1;
    used[pos] = true;
    for(int i = 1; i < n; i++){
        vector < int > vec;
        for(int j = 0; j < n; j++){
            if(!used[j]){
                vec.push_back(j);
            }
        }
        int nxt = Find_next(0, (int)vec.size() - 1, vec);
        ans[i] = nxt + 1;
        used[nxt] = true;
        a[nxt] = 1;
    }
    Answer(ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...