Submission #919925

#TimeUsernameProblemLanguageResultExecution timeMemory
919925LoboDancing Elephants (IOI11_elephants)C++17
10 / 100
2 ms8792 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 const int maxn = 7e4+10; const int lg = 20; const int B = 187; #define int long long int n,s; set<int> espx; set<pair<pair<int,int>,int>> pts; vector<int> x; int 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; 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++) { d[i][0] = x[i]+s; } for(int b = 1; b <= lg; b++) { for(int i = 0; i < n; i++) { if(d[i][b-1] == -1) { d[i][b] = -1; continue; } auto it = pts.upper_bound(mp(mp(d[i][b-1],n+1),n+1)); if(it == pts.end()) { d[i][b] = -1; } else { d[i][b] = d[it->fr.sc][b-1]; } } } } pts.erase(mp(mp(x[iq],iq),0)); pts.erase(mp(mp(x[iq],iq),1)); espx.insert(x[iq]); // pts.insert(mp(mp(x[iq],iq),-1)); x[iq] = xq; pts.insert(mp(mp(x[iq],iq),1)); espx.insert(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 = espx.lower_bound(pos); int nxt; if(itfds == espx.end()) nxt = 1e9+10; else nxt = *itfds; // cout << i << " " << pos << " " << nxt << endl; if(it->sc == 0) { for(int b = lg; b >= 1; b--) { if(d[i][b] == -1) continue; it = pts.upper_bound(mp(mp(d[i][b],n+1),n+1)); if(it != pts.end() && it->fr.fr < nxt && it->sc == 0) { pos = d[i][b]; ans+= (1<<b); // i = -1; // break; // it = pts.upper_bound(mp(mp(pos,n+1),n+1)); // if(it == pts.end() or it->fr.fr >= nxt) { // i = -1; // break; // } i = it->fr.sc; } } } 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...