제출 #1190139

#제출 시각아이디문제언어결과실행 시간메모리
1190139Ghulam_JunaidMinerals (JOI19_minerals)C++20
40 / 100
28 ms6132 KiB
#include <bits/stdc++.h>
#include "minerals.h"
using namespace std;

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

void Solve(int nn){
    n = nn;

    int D = 0;
    for (int i = 1; i <= 2 * n; i ++){
        if (Query(i) == D){
            b.push_back(i);
            Query(i);
        }
        else{
            D++;
            a.push_back(i);
        }
    }
    for (int i : a)
        Query(i);

    for (int i : a){
        int lb = lower_bound(b.begin(), b.end(), i) - b.begin();
        lo[i] = lb - 1;
        hi[i] = n - 1;
    }

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

    for (int it = 0; it < 16; it ++){        
        if (it % 2 == 0){
            for (int i = 0; i < n; i ++){
                int D = Query(b[i]);
                int tmpD;
                for (int x : vec[i]){
                    tmpD = Query(x);
                    if (tmpD == D)
                        hi[x] = i;
                    else
                        lo[x] = i;
                    D = tmpD;

                    if (hi[x] - lo[x] > 1){
                        int mid = (lo[x] + hi[x]) / 2;
                        vec[mid].push_back(x);
                    }
                }
                vec[i].clear();
            }
        }
        else{
            int D = n, tmpD;
            for (int i = n - 1; i >= 0; i --){
                for (int x : vec[i]){
                    tmpD = Query(x);
                    if (tmpD == D)
                        hi[x] = i;
                    else
                        lo[x] = i;
                    D = tmpD;

                    if (hi[x] - lo[x] > 1){
                        int mid = (lo[x] + hi[x]) / 2;
                        vec[mid].push_back(x);
                    }
                }
                vec[i].clear();
                D = Query(b[i]);
            }
        }
    }

    for (int i : a)
        Answer(i, b[hi[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...