제출 #270398

#제출 시각아이디문제언어결과실행 시간메모리
270398PeppaPigDancing Elephants (IOI11_elephants)C++14
26 / 100
26 ms3584 KiB
#include "elephants.h"
#include <bits/stdc++.h>
 
#define pii pair<int, int>
#define x first
#define y second
 
using namespace std;
 
const int N = 1.5e5 + 5;
const int B = 390;
 
int n, k;
int R[B + 1], pos[N];
map<int, int> mp;
vector<int> jump[B + 1], cnt[B + 1], bucket[B + 1];
 
void init(int _n, int _k, int X[]) {
    n = _n, k = _k;
    for(int i = 0; i < n; i++) ++mp[pos[i] = X[i]];
}
 
void solve_bucket(int idx) {
    vector<int> &vec = bucket[idx];
 
    jump[idx] = vector<int>(vec.size()), cnt[idx] = vector<int>(vec.size());
    for(int i = vec.size() - 1; ~i; i--) {
        int nex = upper_bound(vec.begin(), vec.end(), vec[i] + k) - vec.begin();
        if(nex >= vec.size()) jump[idx][i] = vec[i] + k, cnt[idx][i] = 1;
        else jump[idx][i] = jump[idx][nex], cnt[idx][i] = cnt[idx][nex] + 1;
    }
}
 
void revalidate() {
    int ptr = 0;
    for(int i = 0; i < B; i++) bucket[i].clear();
    for(pii p : mp) {
        if(!ptr || bucket[ptr - 1].size() >= B)
            ++ptr;
        bucket[ptr - 1].emplace_back(p.x);
    }
    for(int i = 0; i < B; i++) if(bucket[i].size()) {
        if(bucket[i + 1].size()) R[i] = bucket[i + 1][0];
        else R[i] = 2e9;
 
        solve_bucket(i);
    } 
}
 
void add_elephant(int x) {
    int ptr = 0;
    while(R[ptr] < x) ++ptr;
    int idx = lower_bound(bucket[ptr].begin(), bucket[ptr].end(), x) - bucket[ptr].begin();
    bucket[ptr].insert(bucket[ptr].begin() + idx, x);
 
    solve_bucket(ptr);
}
 
void del_elephant(int x) {
    int ptr = 0;
    while(R[ptr] < x) ++ptr;
    bucket[ptr].erase(lower_bound(bucket[ptr].begin(), bucket[ptr].end(), x));
 
    solve_bucket(ptr);
}
 
int counter;
 
int update(int i, int y) {
    if(counter++ % B == 0) revalidate();
 
    if(!--mp[pos[i]]) del_elephant(pos[i]);
    if(!mp[pos[i] = y]++) add_elephant(y);
 
    int answer = 0, cur = -1;
    for(int i = 0; i < B; i++) {
        int idx = upper_bound(bucket[i].begin(), bucket[i].end(), cur) - bucket[i].begin();
        if(idx < bucket[i].size())
            answer += cnt[i][idx], cur = jump[i][idx];
    }
 
    return answer;
}

컴파일 시 표준 에러 (stderr) 메시지

elephants.cpp: In function 'void solve_bucket(int)':
elephants.cpp:29:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |         if(nex >= vec.size()) jump[idx][i] = vec[i] + k, cnt[idx][i] = 1;
      |            ~~~~^~~~~~~~~~~~~
elephants.cpp: In function 'int update(int, int)':
elephants.cpp:78:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |         if(idx < bucket[i].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...