답안 #110358

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
110358 2019-05-10T18:00:41 Z doowey 코끼리 (Dancing Elephants) (IOI11_elephants) C++14
10 / 100
5 ms 3968 KB
#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 -