Submission #1357528

#TimeUsernameProblemLanguageResultExecution timeMemory
13575280x34cThe Potion of Great Power (CEOI20_potion)C++20
38 / 100
3041 ms43372 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 - 1], b = B[v - 1];
        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;
//         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;
// }
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...