Submission #110362

#TimeUsernameProblemLanguageResultExecution timeMemory
110362dooweyDancing Elephants (IOI11_elephants)C++14
26 / 100
9048 ms4708 KiB
#include <bits/stdc++.h> #include "elephants.h" using namespace std; typedef long long ll; typedef pair<int, int> pii; #define fi first #define se second #define mp make_pair const int MAXN = 150004; const int B = 400; struct Data{ int pos; int jumpl; int nexp; bool operator<(const Data &D) const { return pos < D.pos; } }; vector<Data> Q[MAXN]; int n; int bl; int len; void compute(int id){ if(Q[id].empty()) return; sort(Q[id].begin(), Q[id].end()); int sz = Q[id].size(); int lp = sz - 1; for(int i = sz - 1; i >= 0 ; i -- ){ while(Q[id][lp].pos - Q[id][i].pos > len){ -- lp; } if(lp == sz - 1){ Q[id][i].jumpl = 1; Q[id][i].nexp = Q[id][i].pos + len; } else{ Q[id][i].jumpl = Q[id][lp + 1].jumpl + 1; Q[id][i].nexp = Q[id][lp + 1].nexp; } } } int pz[MAXN]; int oper = 1; void init(int N, int L, int X[]){ n = N; len = L; bl = (n + B - 1) / B; for(int i = 0 ; i < n ; i ++ ) pz[i] = X[i]; for(int i = 0 ; i < n ; i ++ ){ Q[i/B].push_back({X[i], -1, -1}); } for(int i = 0 ; i < bl ; i ++ ) compute(i); } void Erase(int el){ int id = -1; for(int i = bl - 1; i >= 0 ; i -- ){ if(Q[i].empty())continue; if(el >= Q[i][0].pos){ id = i; break; } } vector<int> idx; bool er = false; for(auto p : Q[id]){ if(p.pos == el){ if(er){ idx.push_back(p.pos); } else{ er=true; } } else{ idx.push_back(p.pos); } } Q[id].clear(); for(auto v : idx){ Q[id].push_back({v, -1, -1}); } compute(id); } void Insert(int el){ int id = 0; for(int i = bl - 1; i >= 0 ; i -- ){ if(Q[i].empty()) continue; if(el >= Q[i][0].pos){ id = i; break; } } Q[id].push_back({el, -1, -1}); compute(id); } int update(int i, int y){ Erase(pz[i]); pz[i]=y; Insert(pz[i]); int endp = -1; int res = 0; int rd; Data C; for(int j = 0 ; j < bl ; j ++ ){ if(Q[j].empty()) continue; C = {endp, -1, -1}; rd = upper_bound(Q[j].begin(), Q[j].end(), C) - Q[j].begin(); if(rd < Q[j].size()){ res += Q[j][rd].jumpl; endp = Q[j][rd].nexp; } } for(int j = 0 ; j < bl ; j ++ ){ compute(j); } return res; }

Compilation message (stderr)

elephants.cpp: In function 'int update(int, int)':
elephants.cpp:125:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if(rd < Q[j].size()){
            ~~~^~~~~~~~~~~~~
#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...