Submission #1308539

#TimeUsernameProblemLanguageResultExecution timeMemory
1308539nikaa123Dancing Elephants (IOI11_elephants)C++20
97 / 100
9088 ms15024 KiB
#include<bits/stdc++.h> #include "elephants.h" using namespace std; const int M = 150005; const int B = 500; int n,ll; int a[M]; int t[M]; int fix[M]; int cur; set<pair<int,int>> s; vector <vector<pair<int,int>>> v(605); 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; } nxt[v[j][i].second] = {nxt[v[j][r+1].second].first+1,nxt[v[j][r+1].second].second}; } } void solve() { for (int i = 0; i <= 500; i++) { v[i].clear(); } s.clear(); for (int i = 0; i < n; i++) t[i] = INT_MAX; pair<int,int> pos[M]; for (int i = 0; i < n; i++) { pos[i] = {a[i],i}; } sort(pos,pos+n); for (int i = 0; i < n; i++) { s.insert(pos[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; auto it = s.upper_bound({cur,-1}); while (it != s.end()) { int id = (*it).second; res += nxt[id].first; it = s.upper_bound({nxt[id].second,1000000005}); } return res; } void remove(int x) { pair<int,int> res = {a[x],x}; int j = fix[x]; s.erase(res); auto it = find(v[j].begin(),v[j].end(),res); v[j].erase(it); calc(j); } void add(int x, int pos) { a[x] = pos; int j = max(0, nb - 1); for (int i = 0; i < nb - 1; i++) { if (!v[i].empty() && pos <= v[i].back().first) { j = i; break; } } s.insert({a[x],x}); v[j].push_back({a[x],x}); sort(v[j].begin(),v[j].end()); fix[x] = j; calc(j); if (++op>=B) { solve(); return; } } void init(int N, int L, int X[]) { n = N; ll = L; nb = (n-1+B-1)/B; for (int i = 0; i < n; i++) { a[i] = X[i]; } 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...