제출 #594788

#제출 시각아이디문제언어결과실행 시간메모리
594788skittles1412철로 (IOI14_rail)C++17
100 / 100
80 ms788 KiB
#include "bits/extc++.h"

using namespace std;

template <typename T>
void dbgh(const T& t) {
    cerr << t << endl;
}

template <typename T, typename... U>
void dbgh(const T& t, const U&... u) {
    cerr << t << " | ";
    dbgh(u...);
}

#ifdef DEBUG
#define dbg(...)                                              \
    cerr << "L" << __LINE__ << " [" << #__VA_ARGS__ << "]: "; \
    dbgh(__VA_ARGS__);
#else
#define dbg(...)
#define cerr   \
    if (false) \
    cerr
#endif

#define endl "\n"
#define long int64_t
#define sz(x) int((x).size())

extern "C" int getDistance(int i, int j);

extern "C" void findLocation(int n, int first, int loc[], int type[]) {
    int dist[n];
    dist[0] = 0;
    for (int i = 1; i < n; i++) {
        dist[i] = getDistance(0, i);
    }
    int ord[n - 1];
    iota(ord, ord + n - 1, 1);
    sort(ord, ord + n - 1, [&](int a, int b) -> bool {
        return dist[a] < dist[b];
    });
    loc[0] = first;
    type[0] = 1;
    map<int, bool> m;
    auto meq = [&](int k, bool v) -> bool {
        auto it = m.find(k);
        return it != m.end() && it->second == v;
    };
    m[first] = false;
    int l = 0, r = -1, openr = first, closel = 1e9;
    bool bl = true, br = false;
    for (auto& a : ord) {
        if (r == -1) {
            r = a;
            loc[a] = first + dist[a];
            type[a] = 2;
            m[loc[a]] = 2;
            closel = loc[a];
            continue;
        }
        int ql = getDistance(l, a), qr = getDistance(r, a);
        int posl = loc[l] + ql, posr = loc[r] - qr, mid = (loc[r] + posl - qr) / 2;
        auto it = m.find(mid);
        bool cl;
        if (it != m.end()) {
            cl = !it->second;
        } else {
            cl = mid > openr;
        }
        if (cl) {
            loc[a] = posl;
            type[a] = 2;
            if (loc[a] > loc[r]) {
                r = a;
                br = false;
            } else {
                bl = true;
            }
            closel = min(closel, loc[a]);
        } else {
            loc[a] = posr;
            type[a] = 1;
            if (loc[a] < loc[l]) {
                l = a;
                bl = false;
            } else {
                br = true;
            }
            openr = max(openr, loc[a]);
        }
        m[loc[a]] = type[a] == 2;
        dbg(a, loc[a]);
    }
    for (int i = 0; i < n; i++) {
        dbg(loc[i], type[i]);
    }
}

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

rail.cpp: In function 'void findLocation(int, int, int*, int*)':
rail.cpp:47:10: warning: variable 'meq' set but not used [-Wunused-but-set-variable]
   47 |     auto meq = [&](int k, bool v) -> bool {
      |          ^~~
rail.cpp:53:10: warning: variable 'bl' set but not used [-Wunused-but-set-variable]
   53 |     bool bl = true, br = false;
      |          ^~
rail.cpp:53:21: warning: variable 'br' set but not used [-Wunused-but-set-variable]
   53 |     bool bl = true, br = false;
      |                     ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...