Submission #939670

#TimeUsernameProblemLanguageResultExecution timeMemory
939670haxormanDancing Elephants (IOI11_elephants)C++14
97 / 100
9016 ms23228 KiB
#include "elephants.h" #include <bits/stdc++.h> using namespace std; const int mxN = 150007; const int SZ = 388; int n, l, step, pos[mxN], bkt[mxN], to[mxN], cnt[mxN], sz[SZ]; set<pair<int,int>> st; pair<int,int> arr[SZ][3*SZ]; void fix(int b) { for (int i = sz[b]-1; i >= 0; --i) { int val = arr[b][i].first + l; if (val >= arr[b][sz[b]-1].first) { to[arr[b][i].second] = val; cnt[arr[b][i].second] = 1; } else { auto it = upper_bound(arr[b],arr[b]+sz[b],make_pair(val,INT_MAX)); to[arr[b][i].second] = to[it->second]; cnt[arr[b][i].second] = cnt[it->second] + 1; } } } void construct() { for (int i = 0; i < SZ; ++i) { sz[i] = 0; } vector<pair<int,int>> vec(n); for (int i = 0; i < n; ++i) { vec[i] = {pos[i], i}; } sort(vec.begin(), vec.end()); for (int i = 0; i < n; ++i) { bkt[vec[i].second] = i/SZ; arr[i/SZ][sz[i/SZ]++] = vec[i]; } for (int b = 0; b < SZ; ++b) { fix(b); } } void init(int N, int L, int X[]) { n = N, l = L; for (int i = 0; i < n; ++i) { pos[i] = X[i]; st.insert({pos[i], i}); } construct(); } int update(int i, int y) { for (int j = 0; j < sz[bkt[i]]; ++j) { if (arr[bkt[i]][j].second == i) { arr[bkt[i]][j] = {INT_MAX,INT_MAX}; sort(arr[bkt[i]], arr[bkt[i]]+sz[bkt[i]]); sz[bkt[i]]--; break; } } fix(bkt[i]); for (int b = 0; b < SZ; ++b) { if (b == SZ-1 || (sz[b] && arr[b][sz[b]-1].first > y)) { bkt[i] = b; arr[b][sz[b]++] = {pos[i] = y, i}; sort(arr[b], arr[b]+sz[b]); fix(b); break; } } int ans = 0, cur = -1; for (int b = 0; b < SZ; ++b) { if (sz[b] && arr[b][sz[b]-1].first > cur) { auto it = upper_bound(arr[b],arr[b]+sz[b],make_pair(cur,INT_MAX)); ans += cnt[it->second]; cur = to[it->second]; } } step++; if (step == SZ) { construct(); step = 0; } return ans; }
#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...