제출 #1204120

#제출 시각아이디문제언어결과실행 시간메모리
1204120gohchingjaykMinerals (JOI19_minerals)C++20
40 / 100
1073 ms2424 KiB
#include "minerals.h"
#include "bits/stdc++.h"

using ll = long long;
using namespace std;

int indices[2*43000 + 5];
map<int, vector<int>> pairs;
int N;

void dnc(int marker, int nPairs) {
    if (nPairs == 0) return;
    if (nPairs == 1) return;
    
    int targetPairs = nPairs / 2;
    //std::cerr << marker << ' ' << nPairs << '\n';
    
    for (int i = 1; i <= 2 * N; ++i) {
        if (indices[i] != marker) continue;
        
        int uniques = Query(i);
        if (uniques > targetPairs) {
            Query(i);
            indices[i] = marker * 2 + 1;
        }
    }
    
    int last = 0;
    for (int i = 1; i <= 2 * N; ++i) {
        if (indices[i] == marker) {
            last = Query(i);
            indices[i] = marker * 2;
        }
    }
    
    assert(last == 0);
    
    dnc(marker * 2, targetPairs);
    dnc(marker * 2 + 1, nPairs - targetPairs);
}

void Solve(int V) {
    N = V;
    //std::cerr << "solving" <<'\n';
    fill(indices, indices + 2 * N + 5, 1);
    pairs.clear();

    dnc(1, N);

    for (int i = 1; i <= 2 * N; ++i) pairs[indices[i]].emplace_back(i);

    for (auto &x : pairs) {
        Answer(x.second[0], x.second[1]);
    }
}
#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...