이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "minerals.h"
#include<vector>
#include<set>
#include<random>
#include<algorithm>
#include<iostream>
using namespace std;
int n, s;
//2nlog(2n)
random_device rd;
mt19937 g(rd());
int szdp = 43000;//getting the szdp bigger, trinary search
vector<int> dp0(szdp + 1),nxt0(szdp + 1), dp1(szdp+1), nxt1(szdp+1);
//vector<int> cp0(szdp + 1), cxt0(szdp + 1), cp1(szdp + 1), cxt1(szdp + 1);
void solve(vector<int>& in, vector<int>& rest, int f1, int f2) {
    //cout << "solve "<< in.size() << ' ' << rest.size() << ' ' << flag << endl;
    //shuffle(in.begin(), in.end(), g);
    //shuffle(rest.begin(), rest.end(), g);
    if (in.size() == 1) { Answer(in[0], rest[0]); return; }
    
    vector<int> in1, in2;
    int sz1 = in.size() / 2;
    if (in.size() <= szdp) sz1 = in.size() - nxt0[in.size()];
    
    
    int sz = 0;
    if (f1) {
        for (int i = 0; i < sz1; i++) in1.push_back(in[i]);
        for (int i = sz1; i < in.size(); i++) in2.push_back(in[i]);
        for (int i : in2) sz = Query(i);
    }
    else {
        sz1 = in.size() - sz1;
        for (int i = 0; i < sz1; i++) in1.push_back(in[i]);
        for (int i = sz1; i < in.size(); i++) in2.push_back(in[i]);
        for (int i : in1) sz = Query(i);
    }
    vector<int> rest1, rest2;
    for (int j : rest) {
        //if (rest1.size() == in1.size()) { rest2.push_back(j); continue; }
        //if (rest2.size() == in2.size()) { rest1.push_back(j); continue; }
        int u = Query(j);
        if (u == sz) rest1.push_back(j);
        else {
            rest2.push_back(j);
            sz = u;
        }
    }
    solve(in1, rest1, 1, 1 - f2);
    solve(in2, rest2, 0, 1 - f2);
}
void Solve(int N) {
    //4 dp's, or calculate right the 2 dp's
    dp0[1] = dp1[1] = 0; //the xor
    for (int i = 2; i <= szdp; i++) {
        int l = 1, r = i / 2, m;
        while (r > l) {
            m = (l + r) / 2;
            int vm = dp0[m] + dp0[i - m] + m + i;
            int vm1 = dp0[m+1] + dp0[i - m - 1] + m + 1 + i;
            if (vm > vm1) l = m + 1;
            else r = m;
        }
        dp0[i] = dp0[l] + dp0[i - l] + l + i;
        nxt0[i] = l;
        //if (dp1[i] != dp[i]) { cout << i << ' ' << dp[i] << ' ' << dp1[i] << ' ' << "ERROR!!!" << endl; break; }
    }
    /*cp0[1] = cp1[1] = 0;
    for (int i = 2; i <= 10000; i++) {
        cp0[i] = cp1[i] = 1e9;
        for (int j = 1; j <= i / 2; j++) {
            if (cp0[j] + cp1[i - j] + j + i < cp0[i]) {
                cp0[i] = cp0[j] + cp1[i - j] + j + i;
                cxt0[i] = j;
            }
            if (cp0[j] + cp0[i - j] + 2 * j + i < cp1[i]) {
                cp1[i] = cp0[j] + cp0[i - j] + 2 * j + i;
                cxt1[i] = j;
            }
        }
        if (cp0[i] != dp0[i] || cp1[i] != dp1[i]) cout << "ERROR!\n";
    }*/
    //for (int u = 38000; u <= 43000; u += 1000) cout << u << ' ' << 2 * u + dp0[u] << endl;
    n = N; s = n << 1;
    int sz = 0;
    vector<int> in, rest;
    vector<int> vec(s);
    for (int i = 0; i < s; i++)vec[i] = i + 1;
    //shuffle(vec.begin(), vec.end(), g);
    for (int i : vec) {
        //if (in.size() < n) {
            int u = Query(i);
            if (u > sz) {
                sz = u;
                in.push_back(i);
            }
            else {
                rest.push_back(i);
            }
        
    }
    solve(in, rest, 1, 1);
}
컴파일 시 표준 에러 (stderr) 메시지
minerals.cpp: In function 'void solve(std::vector<int>&, std::vector<int>&, int, int)':
minerals.cpp:24:19: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   24 |     if (in.size() <= szdp) sz1 = in.size() - nxt0[in.size()];
      |         ~~~~~~~~~~^~~~~~~
minerals.cpp:31:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   31 |         for (int i = sz1; i < in.size(); i++) in2.push_back(in[i]);
      |                           ~~^~~~~~~~~~~
minerals.cpp:37:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |         for (int i = sz1; i < in.size(); i++) in2.push_back(in[i]);
      |                           ~~^~~~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |