#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 = 2;
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].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;
}
}
cout << "\n";
return res;
}
Compilation message
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()){
~~~^~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
3840 KB |
Output is correct |
2 |
Correct |
4 ms |
3840 KB |
Output is correct |
3 |
Correct |
5 ms |
3840 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
3840 KB |
Output is correct |
2 |
Correct |
4 ms |
3840 KB |
Output is correct |
3 |
Correct |
5 ms |
3840 KB |
Output is correct |
4 |
Incorrect |
5 ms |
3968 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
3840 KB |
Output is correct |
2 |
Correct |
4 ms |
3840 KB |
Output is correct |
3 |
Correct |
5 ms |
3840 KB |
Output is correct |
4 |
Incorrect |
5 ms |
3968 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
3840 KB |
Output is correct |
2 |
Correct |
4 ms |
3840 KB |
Output is correct |
3 |
Correct |
5 ms |
3840 KB |
Output is correct |
4 |
Incorrect |
5 ms |
3968 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
3840 KB |
Output is correct |
2 |
Correct |
4 ms |
3840 KB |
Output is correct |
3 |
Correct |
5 ms |
3840 KB |
Output is correct |
4 |
Incorrect |
5 ms |
3968 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |