Submission #1357047

#TimeUsernameProblemLanguageResultExecution timeMemory
1357047cavanarDancing Elephants (IOI11_elephants)C++20
0 / 100
0 ms344 KiB
#include "elephants.h"
#include "bits/stdc++.h"

using namespace std;

vector<int> J, T, P, A;
vector<vector<int>> B;

int n, l, k, m;

void calc_bucket(int i) {
    int j = (int)B[i].size() - 1, j_dum = 0, t_dum = -1;

    for (int k = j; k >= 0; k --) {
        for (; P[B[i][j]] - P[B[i][k]] > l; j --) {
            j_dum = J[B[i][j]], t_dum = T[B[i][j]];
        }
        J[B[i][k]] = j_dum + 1, T[B[i][k]] = max(t_dum, P[B[i][k]] + l);
    }
}

void build_buckets() {
    vector<int> o(n);

    iota(begin(o), end(o), 0);
    sort(begin(o), end(o), [](int i, int j) {
        return P[i] < P[j];
    });

    A.resize(n);
    B.clear();

    B.push_back({n});

    for (int i = 0; i < n; i ++) {
        if (B.empty() or (int)B.back().size() > k) {
            B.push_back({});
            J.push_back({});
            T.push_back({});
        }
        B.back().push_back(o[i]);
        A[i] = (int)B.size() - 1;
    }

    J.assign(n, 0);
    T.assign(n, 0);

    for (int i = 0; i < B.size(); i ++) {
        calc_bucket(i);
    }
}

void init(int N, int L, int X[]) {
    n = N, l = L, k = sqrt(N);

    P.resize(N + 1);
    P[n] = -1;

    for (int i = 0; i < N; i ++) {
        P[i] = X[i];
    }

    build_buckets();
}

int update(int i, int y) {
    for (int j = 0; j < (int)B[A[i]].size(); j ++) {
        if (B[A[i]][j] == i) {
            B[A[i]].erase(begin(B[A[i]]) + j);
            calc_bucket(A[i]);
            break;
        }
    }

    P[i] = y;

    for (int j = (int)B.size() - 1; j >= 0; j --) {
        if (not B[j].empty() and P[B[j].front()] <= P[i]) {
            int k = 0;
            for (; k < (int)B[j].size(); k ++) {
                if (P[B[j][k]] > P[i]) {
                    break;
                }
            }
            B[j].insert(begin(B[j]) + k, i);
            calc_bucket(j);
            A[i] = j;
            break;
        }
    }

    int last_pos = -1, answer = 0;

    for (int i = 0; i < (int)B.size(); i ++) {
        int bs = -1;
        for (int l = 0, r = (int)B[i].size() - 1; l <= r;) {
            int mi = (l + r) / 2;
            if (P[B[i][mi]] > last_pos) {
                bs = mi, r = mi - 1;
            } else {
                l = mi + 1;
            }
        }
        if (bs != -1) {
            answer += J[B[i][bs]], last_pos = T[B[i][bs]];
        }
    }

    m ++;

    if (m == k) {
        build_buckets();
    }

    return answer;
}
#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...