제출 #1190159

#제출 시각아이디문제언어결과실행 시간메모리
1190159Ghulam_JunaidMinerals (JOI19_minerals)C++20
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h>
#include "minerals.h"
using namespace std;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

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

int get_mid(int l, int r, bool rev){
    int mid;
    if (!rev){
        mid = (618 * l + 382 * r) / 1000;
        if (mid <= l) mid = l + 1;
    }
    else {
        mid = (382 * l + 618 * r + 999) / 1000;
        if (mid >= r) mid = r - 1;
    }
    return mid;
}

void Solve(int nn){
    srand(time(NULL));

    n = nn;

    vector<int> S;
    for (int i = 1; i <= 2 * n; i ++)
        S.push_back(i);
    for (int i = 2 * n; i > 0; i --)
        swap(S[i - 1], S[rng() % i]);

    int D = 0;
    for (int i = 1; i <= 2 * n; i ++){
        if (Query(i) == D){
            b.push_back(i);
        }
        else{
            D++;
            a.push_back(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 = get_mid(lo[x], hi[x], 0);
        vec[mid].push_back(i);
    }

    for (int it = 0; it < 16; it ++){        
        if (it % 2 == 1){
            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 = get_mid(lo[x], hi[x], 0);
                        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 = get_mid(lo[x], hi[x], 1);
                        vec[mid].push_back(x);
                    }
                }
                vec[i].clear();
                D = Query(b[i]);
            }
        }
    }

    for (int i : a)
        Answer(i, b[hi[i]]);
}

/*

A1. Suffle the slices.
B2. R = cnt-1; ans = cnt;
B3. L = last perfect matching
B4. If group[0].size() == N then rest are group[1]
A5. Find mid only consider non paired items -> use fenwick tree
A6. Ratio = 618 : 382
B7. Iterate back and forth -> reverse ratio
B8. Go back when there is no mid ahead -> use set
A9. Just iterate non paired item -> use fenwick tree
C10. Finish when all answer obtained
A11. Query once

*/

컴파일 시 표준 에러 (stderr) 메시지

minerals.cpp: In function 'void Solve(int)':
minerals.cpp:54:30: error: 'x' was not declared in this scope
   54 |         int mid = get_mid(lo[x], hi[x], 0);
      |                              ^