Submission #1220867

#TimeUsernameProblemLanguageResultExecution timeMemory
1220867HappyCapybaraDancing Elephants (IOI11_elephants)C++20
26 / 100
8 ms1348 KiB
#include "elephants.h" #include<bits/stdc++.h> using namespace std; int k = 400; int n, l, t; vector<int> pos, eb; struct bucket { int es[805], rc[805], rp[805], s; bucket(){ s = 0; }; void create(vector<int> v){ s = v.size(); for (int i=0; i<s; i++) es[i] = v[i]; } void add(int el){ es[s] = el; int cur = s; s++; while (cur && pos[es[cur]] < pos[es[cur-1]]){ swap(es[cur], es[cur-1]); cur--; } } void del(int el){ bool found = false; for (int i=0; i<s; i++){ if (found) es[i-1] = es[i]; if (es[i] == el) found = true; } s--; } void calc(){ int next = s; for (int i=s-1; i>=0; i--){ while (next && pos[es[next-1]] > pos[es[i]]+l) next--; if (next == s){ rc[i] = 1; rp[i] = pos[es[i]]+l; } else { rc[i] = 1+rc[next]; rp[i] = rp[next]; } } } }; vector<bucket*> buckets; void build(){ vector<int> v(n); for (int i=0; i<n; i++) v[i] = i; sort(v.begin(), v.begin(), [](int a, int b){return pos[a] < pos[b];}); int cb = 0; vector<int> cv; for (int i=0; i<n; i++){ cv.push_back(v[i]); eb[v[i]] = cb; if (i % k == k-1 || i == n-1){ buckets[cb]->create(cv); buckets[cb]->calc(); cb++; cv.clear(); } } } int solve(){ int ans = 0; int cur = -1; for (int i=0; i<(int)buckets.size(); i++){ bucket* cb = buckets[i]; if (!cb->s) continue; int l = -1, r = cb->s; while (l < r-1){ int mid = (l+r)/2; if (pos[cb->es[mid]] > cur) r = mid; else l = cur; } if (r == cb->s) continue; ans += cb->rc[r]; cur = cb->rp[r]; } return ans; } void init(int N, int L, int X[]){ n = N; l = L; pos.resize(n); for (int i=0; i<N; i++) pos[i] = X[i]; eb.resize(n); for (int i=0; i<=n/k; i++) buckets.push_back(new bucket()); build(); t = 0; return; } int update(int i, int y){ t++; if (t == k){ pos[i] = y; t = 0; build(); return solve(); } buckets[eb[i]]->del(i); buckets[eb[i]]->calc(); pos[i] = y; int nb = 0; for (int pb = 1; pb < (int)buckets.size(); pb++){ if (buckets[pb]->s && pos[buckets[pb]->es[0]] <= pos[i]) nb = pb; } buckets[nb]->add(i); eb[i] = nb; buckets[nb]->calc(); return solve(); }
#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...