Submission #1248024

#TimeUsernameProblemLanguageResultExecution timeMemory
1248024GrayMinerals (JOI19_minerals)C++20
85 / 100
263 ms11416 KiB
#include "minerals.h"
#include <bits/stdc++.h>
#include <cassert>
using namespace std;
#define ll long long
#define ff first
#define ss second
#define ln "\n"

struct API{
    set<ll> ins; ll val;
    API(){
        val=-1;
    }
    bool status(ll ind){
        return ins.count(ind)>0;
    }
    void in(ll ind){
        if (ins.count(ind)) return;
        val=Query(ind); ins.insert(ind);
    }
    void out(ll ind){
        if (!ins.count(ind)) return;
        val=Query(ind); ins.erase(ind);
    }
    ll get(){
        return val;
    }
    // void debug(){
    //     for (auto x:ins)
    // }
};

int n;

void Solve(int N) {
    n=2*N; API com;
    vector<ll> a, b; int tmp=-1;
    for (ll i=1; i<=n; i++){
        com.in(i);
        int ntmp = com.get();
        if (ntmp!=tmp){
            a.push_back(i);
        }else{
            b.push_back(i);
        }
        tmp=ntmp;
    }
    vector<pair<vector<ll>, vector<ll>>> search, nsearch;
    vector<pair<ll, ll>> res;
    search.push_back({a, b});
    while (!search.empty()){
        for (auto &[sa, sb]:search){
            assert(sa.size()==sb.size());
            if (sa.size()==1){
                res.push_back({sa[0], sb[0]}); continue;
            }
            ll sz=sa.size();
            for (ll i=0; i<sz/2; i++){
                com.in(sa[i]);
            }
            for (ll i=sz/2; i<sz; i++){
                com.out(sa[i]);
            }
        }
        nsearch.clear();
        for (auto &[sa, sb]:search){
            if (sa.size()==1) continue;
            vector<ll> left1, right1, left2, right2;
            ll sz=sa.size();
            for (ll i=0; i<sz/2; i++){
                left1.push_back(sa[i]);
            }
            for (ll i=sz/2; i<sz; i++){
                right1.push_back(sa[i]);
            }
            for (ll i=0; i<(ll)sb.size()-1; i++){
                ll x=sb[i];
                ll prev=com.get();
                if (com.status(x)){
                    com.out(x);
                }else{
                    com.in(x);
                }
                ll cur = com.get();
                if (prev==cur) left2.push_back(x);
                else right2.push_back(x);
            }
            if (left2.size()<right2.size()) left2.push_back(sb.back());
            else right2.push_back(sb.back());
            nsearch.push_back({left1, left2});
            nsearch.push_back({right1, right2});
        }
        swap(search, nsearch);
    }
    for (auto [x, y]:res) Answer(x, y);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...