Submission #269498

#TimeUsernameProblemLanguageResultExecution timeMemory
269498PeppaPigDancing Elephants (IOI11_elephants)C++14
26 / 100
24 ms2312 KiB
#include "elephants.h"
#include <bits/stdc++.h>

#define pii pair<int, int>
#define x first
#define y second

using namespace std;

const int N = 1.5e5 + 5;
const int B = 390;

int n, k;
int start[B], pos[N], id[N], jump[N], cnt[N];
vector<pii> bucket[B + 1];
set<pii> S;

void solve_bucket(int idx) {
    vector<pii> &vec = bucket[idx];
    for(int i = vec.size() - 1; ~i; i--) {
        int now, x; tie(x, now) = vec[i];
        auto it = S.lower_bound(pii(x + k + 1, -1e9));
        if(it == S.end()) jump[now] = -1, cnt[now] = 1;
        else {
            if(id[it->y] != idx) jump[now] = it->y, cnt[now] = 1;
            else jump[now] = jump[it->y], cnt[now] = cnt[it->y] + 1;
        }
    }
}

void init(int _n, int _k, int X[]) {
    n = _n, k = _k;
    fill_n(start, B, 1e9);

    for(int i = 0; i < n; i++) {
        pos[i] = X[i], id[i] = i / B;
        bucket[i / B].emplace_back(pos[i], i);
        S.emplace(pos[i], i);
    }
    for(int i = 0; i < B; i++) if(!bucket[i].empty()) {
        start[i] = bucket[i][0].x;
        solve_bucket(i);
    }
}

void add(int i, bool b) {
    int ptr = 0;
    while(ptr + 1 < B && start[ptr + 1] <= pos[i])
        ++ptr;

    int idx = lower_bound(bucket[ptr].begin(), bucket[ptr].end(), pii(pos[i], i)) - bucket[ptr].begin();
    if(b) {
        bucket[ptr].insert(bucket[ptr].begin() + idx, pii(pos[i], i));
        S.emplace(pos[i], i);
    } else {
        bucket[ptr].erase(bucket[ptr].begin() + idx);
        S.erase(pii(pos[i], i));
    }

    solve_bucket(ptr);
}

void revalidate() {
    fill_n(start, B, 1e9);

    int ptr = 0;
    for(pii p : S) {
        if(!ptr || (ptr - 1) / B != ptr / B)
            bucket[ptr / B].clear();
        bucket[ptr / B].emplace_back(p);
        ++ptr;
    }
    for(int i = 0; i < B; i++) if(!bucket[i].empty()) {
        start[i] = bucket[i][0].x;
        solve_bucket(i);
    }
}

int counter;

int update(int i, int y) {
    if(++counter % B == 0)
        revalidate();
    add(i, 0);
    pos[i] = y;
    add(i, 1);

    // for(int i = 0; i < n; i++) printf("(%d %d)\n", jump[i], cnt[i]);

    int now = S.begin()->y, answer = 0;
    while(now != -1) {
        answer += cnt[now];
        now = jump[now];
    }

    // printf("answer = %d\n", answer);

    return answer;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...