Submission #1308570

#TimeUsernameProblemLanguageResultExecution timeMemory
1308570nikaa123Dancing Elephants (IOI11_elephants)C++20
100 / 100
4191 ms10508 KiB
#include<bits/stdc++.h> #include "elephants.h" using namespace std; const int M = 150005; int B = 400; int n,ll; int a[M]; int t[M]; int fix[M]; pair<int,int> pos[M]; set<pair<int,int>> s; vector <vector<pair<int,int>>> v(700); pair <int,int> nxt[M]; int nb = (n-1+B-1)/B; int op; void calc(int j) { if (v[j].empty()) return; int r = v[j].size()-1; for (int i = v[j].size()-1; i >= 0; i--) { int cur = v[j][i].first + ll; while (r > i && v[j][r].first > cur) r--; if (r == v[j].size()-1) { nxt[v[j][i].second] = {1,cur}; continue; } pair<int, int> next_step = nxt[v[j][r + 1].second]; nxt[v[j][i].second] = {next_step.first + 1, next_step.second}; } } void solve() { int total = 0; for (int i = 0; i < nb; i++) { for (auto p:v[i]) pos[total++] = p; v[i].clear(); } sort(pos,pos+n); for (int i = 0; i < n; i++) { v[i/B].push_back(pos[i]); fix[pos[i].second] = i/B; } nb = (n + B - 1) / B; for (int i = 0; i < nb; i++) { calc(i); } op = 0; } int getans() { int cur = -1; int res = 0; for (int i = 0; i < nb; i++) { if (v[i].empty() || v[i].back().first <= cur) { continue; } auto it = upper_bound(v[i].begin(),v[i].end(),make_pair(cur,INT_MAX)); int ind = it->second; res += nxt[ind].first; cur = nxt[ind].second; } return res; } void remove(int x) { int j = fix[x]; auto it = lower_bound(v[j].begin(), v[j].end(), make_pair(a[x], x)); if (it != v[j].end() && it->second == x) v[j].erase(it); calc(j); } void add(int x, int position) { a[x] = position; int j = nb - 1; for (int i = 0; i < nb - 1; i++) { if (!v[i].empty() && position <= v[i].back().first) { j = i; break; } } auto it = lower_bound(v[j].begin(),v[j].end(),make_pair(a[x],x)); v[j].insert(it,{a[x],x}); fix[x] = j; calc(j); if (++op>=B) { solve(); return; } } void init(int N, int L, int X[]) { n = N; ll = L; nb = 1; for (int i = 0; i < n; i++) { a[i] = X[i]; v[0].push_back({X[i],i}); } sort(v[0].begin(),v[0].end()); solve(); } int update(int i, int y) { remove(i); add(i,y); int res = getans(); return res; }
#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...