제출 #465411

#제출 시각아이디문제언어결과실행 시간메모리
465411JovanBDancing Elephants (IOI11_elephants)C++17
50 / 100
9086 ms8016 KiB
#pragma GCC optimize("Ofast")
#include "elephants.h"
#include <bits/stdc++.h>
using namespace std;

int n, k;

const int N = 150000;
const int K = 250;

int dp[N+5], dokle[N+5], pos[N+5];
vector <pair <int, int>> vec[N+5];

void Calc(int tr){
    if(vec[tr].empty()) return;
    int j = vec[tr].size() - 1;
    for(int i=vec[tr].size()-1; i>=0; i--){
        while(vec[tr][i].first + k - 1 < vec[tr][j].first) j--;
        if(j == vec[tr].size() - 1){
            dp[vec[tr][i].second] = 1;
            dokle[vec[tr][i].second] = vec[tr][i].first + k - 1;
        }
        else{
            dp[vec[tr][i].second] = dp[vec[tr][j+1].second] + 1;
            dokle[vec[tr][i].second] = dokle[vec[tr][j+1].second];
        }
    }
}

void Build(const vector <pair <int, int>> &v){
    for(int i=1; i<=n; i++) vec[i].clear();
    int tr = 1;
    for(auto c : v){
        if(vec[tr].size() > K){
            Calc(tr);
            tr++;
        }
        vec[tr].push_back(c);
    }
    Calc(tr);
}

void Rebuild(){
    vector <pair <int, int>> v;
    for(int i=1; i<=n; i++) for(auto c : vec[i]) v.push_back(c);
    Build(v);
}

int query(){
    int tr = -1, res = 0;
    for(int i=1; i<=n; i++){
        auto x = upper_bound(vec[i].begin(), vec[i].end(), make_pair(tr, n+5));
        if(x == vec[i].end()) continue;
        res += dp[x->second];
        tr = dokle[x->second];
    }
    return res;
}

void init(int _n, int L, int X[]){
    n = _n, k = L + 1;
    vector <pair <int, int>> x;
    for(int i=0; i<n; i++){
        pos[i] = X[i];
        x.push_back({X[i], i});
    }
    Build(x);
}

void brisi(int ind, int tr){
    for(int i=0; i<vec[tr].size(); i++){
        if(vec[tr][i] == make_pair(pos[ind], ind)){
            vec[tr].erase(vec[tr].begin() + i);
            return;
        }
    }
}

void dodaj(int ind, int tr){
    for(int i=0; i<vec[tr].size(); i++){
        if(vec[tr][i] > make_pair(pos[ind], ind)){
            vec[tr].insert(vec[tr].begin() + i, {pos[ind], ind});
            return;
        }
    }
    vec[tr].push_back({pos[ind], ind});
    return;
}

int update(int ind, int y){
    int gde = 1;
    for(int i=1; i<=2+n/K; i++){
        if(vec[i].empty()) continue;
        gde = i;
        if(make_pair(pos[ind], ind) <= vec[i].back()) break;
    }
    brisi(ind, gde);
    Calc(gde);
    pos[ind] = y;
    gde = 1;
    for(int i=1; i<=2+n/K; i++){
        if(vec[i].empty()) continue;
        gde = i;
        if(make_pair(pos[ind], ind) <= vec[i].back()) break;
    }
    dodaj(ind, gde);
    Calc(gde);
    if(vec[gde].size() > 2*K) Rebuild();
    return query();
}

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

elephants.cpp: In function 'void Calc(int)':
elephants.cpp:19:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |         if(j == vec[tr].size() - 1){
      |            ~~^~~~~~~~~~~~~~~~~~~~~
elephants.cpp: In function 'void brisi(int, int)':
elephants.cpp:71:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |     for(int i=0; i<vec[tr].size(); i++){
      |                  ~^~~~~~~~~~~~~~~
elephants.cpp: In function 'void dodaj(int, int)':
elephants.cpp:80:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |     for(int i=0; i<vec[tr].size(); i++){
      |                  ~^~~~~~~~~~~~~~~
#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...