답안 #51139

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
51139 2018-06-16T16:17:24 Z imeimi2000 코끼리 (Dancing Elephants) (IOI11_elephants) C++17
0 / 100
2 ms 376 KB
#include "elephants.h"
#include <algorithm>
#include <map>

using namespace std;

const int t = 2000;
const int MAXN = 2e5;
int n, l, a[MAXN];
int x[MAXN];
int bs;
map<int, int> mp;

struct _dp {
    int cnt, mx;
    _dp operator+(int x) const {
        return { cnt + x, mx };
    }
} dp[t][t << 1 | 1];

int buc[t][t << 1 | 1];
int s[t];

const int inf = 1e9 + 7;
void recalc(int s) {
    int j = buc[s][0];
    for (int i = j++; i > 0; --i) {
        while (j > 1 && buc[s][i] + l < buc[s][j - 1]) --j;
        if (j <= buc[s][0]) dp[s][i] = dp[s][j] + 1;
        else dp[s][i] = { 1, buc[s][i] };
    }
}

void reset() {
    for (int i = 0; t * i < n; ++i) {
        bs = i + 1;
        buc[i][0] = 0;
        for (int j = 0; j < t && t * i + j < n; ++j) {
            buc[i][++buc[i][0]] = x[t * i + j];
        }
        recalc(i);
        s[i] = buc[i][1];
    }
}

void getX() {
    int p = 0;
    for (int i = 0; i < bs; ++i) {
        for (int j = 1; j <= buc[i][0]; ++j) {
            x[p++] = buc[i][j];
        }
    }
}

void init(int N, int L, int X[]) {
    n = N;
    l = L;
    for (int i = 0; i < n; ++i) ++mp[a[i] = x[i] = X[i]];
    n = unique(x, x + n) - x;
    reset();
}

int getBuc(int i) {
    return lower_bound(s + 1, s + bs, i + 1) - s - 1;
}

int update(int p, int y) {
    int s, si;
    if (--mp[a[p]] == 0) {
        s = getBuc(a[p]);
        si = lower_bound(buc[s] + 1, buc[s] + (buc[s][0] + 1), a[p]) - buc[s];
        for (int i = si; i < buc[s][0]; ++i) {
            buc[s][i] = buc[s][i + 1];
        }
        --buc[s][0];
        --n;
        recalc(s);
    }
    if (mp[y]++ == 0) {
        ++mp[y];
        s = getBuc(y);
        if (buc[s][0] == (t << 1)) getX(), reset(), s = getBuc(y);
        si = lower_bound(buc[s] + 1, buc[s] + (buc[s][0] + 1), y) - buc[s];
        for (int i = ++buc[s][0]; i > si; --i) {
            buc[s][i] = buc[s][i - 1];
        }
        buc[s][si] = y;
        ++n;
        recalc(s);
    }
    a[p] = y;
    int ret = 0;
    p = -inf;
    for (int i = 0; i < bs; ++i) {
        int j = lower_bound(buc[i] + 1, buc[i] + (buc[i][0] + 1), p + l + 1) - buc[i];
        if (j <= buc[i][0]) {
            ret += dp[i][j].cnt;
            p = dp[i][j].mx;
        }
    }
    return ret;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 376 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 376 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 376 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 376 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 376 KB Output isn't correct
2 Halted 0 ms 0 KB -