Submission #705876

#TimeUsernameProblemLanguageResultExecution timeMemory
705876qwerasdfzxclMinerals (JOI19_minerals)C++17
85 / 100
49 ms4460 KiB
#include "minerals.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
int n, cur, ans[100100], chk[100100];

void dnc0(vector<int> a);
void dnc1(vector<int> L, vector<int> R, int onL, int onR);

int myquery(int x, int typ = -1){
    if (typ==chk[x]) return cur;
    chk[x] ^= 1;
    cur = Query(x);
    return cur;
}

void dnc0(vector<int> a){
    int c = a.size() / 2;

    if (c==0) return;
    if (c==1){
        ans[a[0]] = a[1];
        ans[a[1]] = a[0];
        return;
    }

    vector<int> L, R;
    for (auto &x:a){
        int prv = cur;
        int now = myquery(x);
        if (now==prv){
            R.push_back(x);
        }
        else{
            L.push_back(x);
        }
    }

    dnc1(L, R, 1, 1);
}

void dnc1(vector<int> L, vector<int> R, int onL, int onR){
    // printf("dnc1: ");
    // for (auto &x:L) printf("%d ", x);
    // printf("\n");
    // for (auto &x:R) printf("%d ", x);
    // printf("\n");
    
    int c = L.size();

    if (c==0) return;
    if (c==1){
        ans[L[0]] = R[0];
        ans[R[0]] = L[0];
        return;
    }

    vector<int> L1, R1, L2, R2;
    for (int i=0;i<c/2;i++) {L1.push_back(L[i]); myquery(L[i], !onL);}
    for (int i=c/2;i<c;i++) L2.push_back(L[i]);

    for (auto &x:R){
        if (x==R.back()){
            if (L1.size()!=R1.size()) R1.push_back(x);
            else R2.push_back(x);
            continue;
        }

        int prv = cur;
        int delta = myquery(x, !onR) - prv;

        if ((!onL) == (delta==0)) R1.push_back(x);
        else R2.push_back(x);
    }

    dnc1(L1, R1, !onL, !onR);
    dnc1(L2, R2, onL, !onR);
}

void Solve(int N) {
    n = N, cur = 0;
    vector<int> a;
    for (int i=1;i<=n*2;i++) a.push_back(i);
    
    dnc0(a);

    for (int i=1;i<=n*2;i++) if (i < ans[i]) Answer(i, ans[i]);
}
#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...