제출 #1357517

#제출 시각아이디문제언어결과실행 시간메모리
13575170x34cThe Potion of Great Power (CEOI20_potion)C++20
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define ff first
#define ss second

using namespace std;

const int INF = 1000000000;

int N, D, U, BLOCK;
vector<int> H, cnt_changes;

vector<vector<pair<int, multiset<pii>>>> states;
vector<multiset<pii>> cur_states;
vector<pii> changes;
vector<vector<int>> node_changes;

void init(int n, int d, int h[])
{
    N = n;
    D = d;

    H.resize(N);
    states.resize(N);
    cur_states.resize(N, {});
    node_changes.resize(N, {});
    for (int i = 0; i < N; i++)
        H[i] = h[i];

    for (int i = 0; i < N; i++)
        states[i].push_back({0, {}});
}

void curseChanges(int u, int A[], int B[])
{
    U = u;
    BLOCK = sqrtl(U);

    cnt_changes.resize(N, 0);
    changes.resize(U + 1);
    for (int i = 1; i <= U; i++)
    {
        changes[i] = {A[i - 1], B[i - 1]};
        node_changes[A[i - 1]].push_back(i);
        node_changes[B[i - 1]].push_back(i);
    }

    for (int v = 1; v <= U; v++)
    {
        int a = A[v], b = B[v];
        if (cnt_changes[a] >= BLOCK)
        {
            states[a].push_back({v, {}});
            for (auto x : cur_states[a])
                states[a].back().ss.insert(x);
            cnt_changes[a] = 0;
        }

        if (cnt_changes[b] >= BLOCK)
        {
            states[b].push_back({v, {}});
            for (auto x : cur_states[b])
                states[b].back().ss.insert(x);
            cnt_changes[b] = 0;
        }

        cnt_changes[a]++;
        cnt_changes[b]++;

        if (cur_states[a].count({H[b], b}))
            cur_states[a].erase(cur_states[a].find({H[b], b}));
        else
            cur_states[a].insert({H[b], b});

        if (cur_states[b].count({H[a], a}))
            cur_states[b].erase(cur_states[b].find({H[a], a}));
        else
            cur_states[b].insert({H[a], a});
    }
}

multiset<pii> get_set(int x, int v)
{
    int l = 0, r = states[x].size() - 1;
    int lb = 0;
    while (l <= r)
    {
        int m = l + (r - l) / 2;
        if (states[x][m].ff <= v)
        {
            lb = m;
            l = m + 1;
        }
        else
            r = m - 1;
    }

    int cur_v = states[x][lb].ff;
    multiset<pii> cur = states[x][lb].ss;

    auto iter = lower_bound(node_changes[x].begin(), node_changes[x].end(), cur_v);
    while (iter != node_changes[x].end() && *iter <= v)
    {
        int idx = *iter;
        auto [a, b] = changes[idx];

        if (a != x)
            swap(a, b);

        if (cur.count({H[b], b}))
            cur.erase(cur.find({H[b], b}));
        else
            cur.insert({H[b], b});
        cur_v = idx;
        iter++;
    }

    return cur;
}

int question(int x, int y, int v)
{
    multiset<pii> a = get_set(x, v), b = get_set(y, v);
    if (a.empty() || b.empty())
        return INF;

    int ret = INF;
    for (auto [hei, _] : a)
    {
        auto lwr = b.lower_bound({hei, -1});
        if (lwr != b.end())
            ret = min(ret, abs(lwr->first - hei));

        if (lwr != b.begin())
        {
            --lwr;
            ret = min(ret, abs(hei - lwr->first));
        }
    }

    return ret;
}

int main()
{
    int N, D, U, Q;
    std::ios::sync_with_stdio(false);
    std::cin.tie(NULL);
    std::cin >> N >> D >> U >> Q;

    int *F = new int[N];
    for (int i = 0; i < N; i++)
        std::cin >> F[i];
    init(N, D, F);

    int *A = new int[U], *B = new int[U];
    for (int i = 0; i < U; i++)
    {
        std::cin >> A[i] >> B[i];
    }
    curseChanges(U, A, B);

    bool correct = true;
    for (int i = 0; i < Q; i++)
    {
        int X, Y, V, CorrectAnswer;
        std::cin >> X >> Y >> V >> CorrectAnswer;
        if (i == 705)
            cout << 'h';
        int YourAnswer = question(X, Y, V);
        if (YourAnswer != CorrectAnswer)
        {
            std::cout << "WA! Question: " << i
                      << " (X=" << X << ", Y=" << Y << ", V=" << V << ") "
                      << "Your answer: " << YourAnswer
                      << " Correct Answer: " << CorrectAnswer << std::endl;
            correct = false;
        }
        else
        {
            std::cerr << YourAnswer << " - OK" << std::endl;
        }
    }

    if (correct)
    {
        std::cout << "Correct." << std::endl;
    }
    else
        std::cout << "Incorrect." << std::endl;
    return 0;
}

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

/usr/bin/ld: /tmp/ccExJ4b8.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccgn6rki.o:potion.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status