Submission #1170409

#TimeUsernameProblemLanguageResultExecution timeMemory
1170409bbartekMinerals (JOI19_minerals)C++20
100 / 100
38 ms4192 KiB
#include <bits/stdc++.h>
#include "minerals.h"

using namespace std;

typedef long long ll;
#define st first
#define nd second
#define pb push_back

const int maxn = 1e5+7;

/*
int para[] = {0,1,3,3,1,2,4,4,2};

set<int> zbior;
int Query(int x){
    if(zbior.count(x)){
        zbior.erase(x);
    }
    else{
        zbior.insert(x);
    }
    set<int> aktualny;
    for(auto i : zbior){
        aktualny.insert(para[(i)]);
    }
    return aktualny.size();
}

void Answer(int a, int b) {
    cout<<a<<" "<<b<<"\n";
}
*/

bool zaznaczone[maxn];
vector<pair<int,int>> wyniki;
double fi = 1.61;

mt19937 gen(234678);

void rek(vector<int> num1,vector<int> num2,bool parzystosc,bool obrot){
    shuffle(num1.begin(),num1.end(),gen);
    shuffle(num2.begin(),num2.end(),gen);
    if(num1.size() == 1){
        //cout<<num1.size()<<" "<<num2.size()<<" "<<parzystosc<<"\n";
        wyniki.pb({num1[0],num2[0]});
        return;
    }
    vector<int> x1,x2,y1,y2;
    int dlu = num1.size(),nowy,stary;
    int a = (double(dlu)/fi), b = dlu-a; 
    if(parzystosc == 0){
        for(int i=0;i<b;i++){
            stary = Query(num1[i]);
            x1.pb(num1[i]);
        }   
        for(int i=b;i<dlu;i++){
            y1.pb(num1[i]);
        }
    }
    else{
        for(int i=0;i<a;i++){
            x1.pb(num1[i]);
        }
        for(int i=a;i<dlu;i++){
            stary = Query(num1[i]);
            y1.pb(num1[i]);
        }
    }
    for(int i=0;i<dlu;i++){
        if(x2.size() == x1.size()){
            y2.pb(num2[i]);
            continue;
        }
        if(y2.size() == y1.size()){
            x2.pb(num2[i]);
            continue;
        }
        nowy = Query(num2[i]);
        if(obrot){
            if(nowy == stary){
                y2.pb(num2[i]);
            }
            else{
                x2.pb(num2[i]);
            } 
        }
        else{
            if(nowy == stary){
                x2.pb(num2[i]);
            }
            else{
                y2.pb(num2[i]);
            }
        }
        stary = nowy;
    }
    rek(x1,x2,0,!obrot);
    rek(y1,y2,1,!obrot);

    return;
}

void Solve(int n) {   //Query(x) // Answer(a,b)
    vector<int> vect1,vect2;
    int a=0,b;
    for(int i=1;i<=2*n;i++){
        b = Query(i);
        if(b != a)
            vect1.pb(i);
        else
            vect2.pb(i);

        a = b;
    }
    rek(vect1,vect2,0,1);

    for(int i=0;i<n;i++){
        Answer(wyniki[i].st,wyniki[i].nd);
    }
}
/*
int main(){
    Solve(4);
    return 0;
}
*/
#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...