Submission #1350763

#TimeUsernameProblemLanguageResultExecution timeMemory
1350763StefanSebezMinerals (JOI19_minerals)C++20
100 / 100
385 ms7924 KiB
#include "minerals.h"
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
#define mp make_pair
const ld p=0.3812;
mt19937 rng(time(0));
set<int>minerals;
int diff;
void Insert(int i){
    if(minerals.find(i)!=minerals.end())exit(-1);
    minerals.insert(i);
    diff=Query(i);
}
void Erase(int i){
    if(minerals.find(i)==minerals.end())exit(-1);
    minerals.erase(i);
    diff=Query(i);
}
void Toggle(int i){
    if(minerals.find(i)==minerals.end())Insert(i);
    else Erase(i);
}
bool Get(int i){return minerals.find(i)!=minerals.end();}
bool Pair(int i){
    int diff1=diff;
    if(!Get(i)){
        Insert(i);
        return diff==diff1;
    }
    else{
        Erase(i);
        return diff==diff1;
    }
}
vector<pair<int,int>>Solve(vector<int>a,vector<int>b){
    shuffle(a.begin(),a.end(),rng);
    shuffle(b.begin(),b.end(),rng);
    if(a.size()==1)return{{a[0],b[0]}};
    if(a.size()==2){
        if(Get(a[0])^Get(a[1])==0&&Get(b[0])^Get(b[1])==0)Toggle(a[0]);
        if(Get(a[0])^Get(a[1])){
            if(Pair(b[0])^Get(a[1])==0)swap(b[0],b[1]);
        }
        else{
            if(Pair(a[0])^Get(b[1])==0)swap(b[0],b[1]);
        }
        return{{a[0],b[0]},{a[1],b[1]}};
    }
    int n=a.size(),m=p*n;
    if(n<=6)m=n+1>>1;
    vector<int>A1,A2,B1,B2;
    for(auto i:a){
        if(Get(i))A1.pb(i);
        else A2.pb(i);
    }
    while(A1.size()<m){
        int i=A2.back();A2.pop_back();
        Toggle(i);
        A1.pb(i);
    }
    while(A2.size()<m){
        int i=A1.back();A1.pop_back();
        Toggle(i);
        A2.pb(i);
    }
    if(A1.size()<=A2.size()){
        while(A1.size()>m){
            int i=A1.back();A1.pop_back();
            Toggle(i);
            A2.pb(i);
        }
    }
    else{
        while(A2.size()>m){
            int i=A2.back();A2.pop_back();
            Toggle(i);
            A1.pb(i);
        }
    }
    for(int i=0;i<n;i++){
        if(B1.size()==A1.size()){
            while(i<n)B2.pb(b[i++]);
            break;
        }
        if(B2.size()==A2.size()){
            while(i<n)B1.pb(b[i++]);
            break;
        }
        if(Pair(b[i]))B1.pb(b[i]);
        else B2.pb(b[i]);
    }
    vector<pair<int,int>>res=Solve(A1,B1);
    for(auto i:Solve(A2,B2))res.pb(i);
    return res;
}
void Solve(int n){
    vector<int>a,b;
    for(int i=1;i<=2*n;i++){
        int diff1=diff;
        Insert(i);
        if(diff==diff1)b.pb(i);
        else a.pb(i);
    }
    for(auto [x,y]:Solve(a,b))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...