Submission #923127

#TimeUsernameProblemLanguageResultExecution timeMemory
923127LoboDancing Elephants (IOI11_elephants)C++17
50 / 100
9038 ms23580 KiB
#include "elephants.h" #include <bits/stdc++.h> using namespace std; #define mp make_pair #define pb push_back #define fr first #define sc second #define all(x) x.begin(),x.end() const int maxn = 7e4+10; const int lg = 17; const int B = 187; // #define int long long #define ll long long int n,s; vector<int> espx; set<pair<pair<int,int>,int>> pts; vector<int> x; int p[maxn][lg+1], d[maxn][lg+1]; void init(int32_t N, int32_t L, int32_t X[]) { n = N; s = L; for(int i = 0; i < n; i++) { pts.insert(mp(mp(X[i],i),0)); x.pb(X[i]); } } int cntq = 0; void putespx(int val) { // int sub = -1; // for(int i = 0; i < espx.size(); i++) { // if(espx[i] == val) return; // if(sub == -1 && espx[i] > val) { // sub = val; // swap(espx[i],sub); // } // else { // swap(espx[i],sub); // } // } // if(sub == -1) sub = val; // espx.pb(sub); espx.pb(val); sort(all(espx)); espx.erase(unique(all(espx)),espx.end()); } int32_t update(int32_t iq, int32_t xq) { if(cntq == 0) { vector<pair<pair<int,int>,int>> rem,add; for(auto X : pts) { if(X.sc == 1) { rem.pb(X); add.pb(mp(X.fr,0)); } } espx.clear(); for(auto X : rem) pts.erase(X); for(auto X : add) pts.insert(X); for(int i = 0; i < n; i++) { auto it = pts.upper_bound(mp(mp(x[i]+s,n+1),n+1)); if(it == pts.end()) p[i][0] = -1; else { p[i][0] = it->fr.sc; d[i][0] = x[p[i][0]]; } } for(int b = 1; b <= lg; b++) { for(int i = 0; i < n; i++) { if(p[i][b-1] == -1 or p[p[i][b-1]][b-1] == -1) { p[i][b] = -1; continue; } p[i][b] = p[p[i][b-1]][b-1]; d[i][b] = x[p[i][b]]; } } } pts.erase(mp(mp(x[iq],iq),0)); pts.erase(mp(mp(x[iq],iq),1)); // espx.insert(x[iq]); putespx(x[iq]); x[iq] = xq; pts.insert(mp(mp(x[iq],iq),1)); // espx.insert(x[iq]); putespx(x[iq]); int pos = -1; int32_t ans = 0; while(true) { auto it = pts.upper_bound(mp(mp(pos,n+1),n+1)); if(it == pts.end()) break; int i = it->fr.sc; pos = x[i]; auto itfds = lower_bound(all(espx),pos); int nxt; if(itfds == espx.end()) nxt = 1e9+10; else nxt = *itfds; if(it->sc == 0) { for(int b = lg; b >= 0; b--) { if(p[i][b] != -1 && d[i][b] < nxt) { ans+= (1<<b); i = p[i][b]; } } pos = x[i]; } if(i != -1) { pos = pos+s; ans+= 1; } } cntq = (cntq+1)%B; return ans; }
#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...