Submission #51141

#TimeUsernameProblemLanguageResultExecution timeMemory
51141imeimi2000Dancing Elephants (IOI11_elephants)C++17
100 / 100
3127 ms78636 KiB
#include "elephants.h" #include <algorithm> #include <map> using namespace std; const int t = 500; 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) { 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; }
#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...