Submission #1220857

#TimeUsernameProblemLanguageResultExecution timeMemory
1220857HappyCapybaraDancing Elephants (IOI11_elephants)C++20
0 / 100
0 ms320 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(){}; 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 == 0 || i == n-1){ buckets[cb]->create(cv); buckets[cb]->calc(); cb++; } } } int solve(){ int ans = 0; int cur = -1; for (bucket* cb : buckets){ 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[]){ cerr << "a" << endl; 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; cerr << "b" << endl; return; } int update(int i, int y){ cerr << i << " " << y << endl; 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(); cerr << "done" << endl; cerr << solve() << endl; 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...