Submission #1215359

#TimeUsernameProblemLanguageResultExecution timeMemory
1215359AbdullahIshfaqMinerals (JOI19_minerals)C++20
0 / 100
4 ms2768 KiB
#include <bits/stdc++.h>
#include "minerals.h"
using namespace std;

const int MXN = 1e5 + 100;
int lo[MXN], hi[MXN];
vector<int> a, b, vec[MXN];
set<int> M, done;

int cur, pre;

bool Q(int i) {
    cur = Query(i);
    bool changed = (cur != pre);
    pre = cur;
    return changed;
}

void Solve(int n){
    pre = 0;
    for (int i = 1; i <= 2 * n; ++i) {
        if (Q(i)) a.push_back(i);
        else      b.push_back(i);
    }

    for (int i : a) {
        lo[i] = -1;
        hi[i] = n - 1;
        int mid = (lo[i] + hi[i]) / 2;
        vec[mid].push_back(i);
        M.insert(mid);
    }

    while (!M.empty()) {
        int mid = *M.begin();
        M.erase(mid);

        for (int x : vec[mid]) {
            pre = 0;
            for (int i = 0; i <= mid; ++i) Q(b[i]);
            bool matched = Q(x);
            if (matched)
                hi[x] = mid;
            else
                lo[x] = mid;

            if (hi[x] - lo[x] > 1) {
                int newmid = (lo[x] + hi[x]) / 2;
                vec[newmid].push_back(x);
                M.insert(newmid);
            } else {
                done.insert(x);
            }
        }
        vec[mid].clear();
    }

    for (int x : a)
        Answer(x, b[hi[x]]);
}
#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...