Submission #1211533

#TimeUsernameProblemLanguageResultExecution timeMemory
1211533HappyCapybaraDancing Elephants (IOI11_elephants)C++20
26 / 100
9094 ms2380 KiB
#include "elephants.h" #include<bits/stdc++.h> using namespace std; #define es first #define res second int k = 400; int n, l, t; set<pair<int,int>> e; vector<int> pos, eb; vector<pair<set<pair<int,int>>, unordered_map<int,pair<int,int>>>> buckets; void calc(pair<set<pair<int,int>>, unordered_map<int,pair<int,int>>>& b){ auto it = b.es.end(); while (it != b.es.begin()){ it--; auto next = b.es.upper_bound({it->first+l, 1000000}); if (next == b.es.end()) b.res[it->second] = {1, it->first+l}; else b.res[it->second] = {1+b.res[next->second].first, b.res[next->second].second}; } } void build(){ int ct = 0, cb = 0; auto it = e.begin(); buckets[0].es.clear(); buckets[0].res.clear(); while (it != e.end()){ buckets[cb].es.insert(*it); eb[it->second] = cb; it++; ct++; if (ct == k){ ct = 0; cb++; buckets[cb].es.clear(); buckets[cb].res.clear(); } } for (auto b : buckets) calc(b); } int solve(){ int ans = 0; auto cur = e.begin(); while (cur != e.end()){ pair<int,int> jump = buckets[eb[cur->second]].res[cur->second]; ans += jump.first; cur = e.upper_bound({jump.second, 1000000}); } 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]; e.insert({X[i], i}); } eb.resize(n); set<pair<int,int>> emptyset; unordered_map<int,pair<int,int>> emptymap; for (int i=0; i<=n/k; i++) buckets.push_back({emptyset, emptymap}); build(); t = 0; } int update(int i, int y){ t++; if (t == 4*k){ e.erase({pos[i], i}); pos[i] = y; e.insert({pos[i], i}); t = 0; build(); return solve(); } buckets[eb[i]].es.erase({pos[i], i}); calc(buckets[eb[i]]); e.erase({pos[i], i}); pos[i] = y; e.insert({pos[i], i}); int nb = 0; for (int pb = 1; pb < buckets.size(); pb++){ if (!buckets[pb].es.empty()){ if (buckets[pb].es.begin()->first <= pos[i]) nb = pb; else break; } } buckets[nb].es.insert({pos[i], i}); eb[i] = nb; calc(buckets[nb]); 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...