제출 #1362738

#제출 시각아이디문제언어결과실행 시간메모리
1362738ZeroCool코끼리 (Dancing Elephants) (IOI11_elephants)C++20
컴파일 에러
0 ms0 KiB
#include "elephants.h"
#include <bits/stdc++.h>
#define ar array

using namespace std;

const int INF = 1e9;

int l;

struct Koce{
    vector<ar<int,2>> A;
    vector<int> C, F;
    int mn, mx;

    Koce(){

    }

    void calc(){//In case you are new to the stream, calc is short for calculator btw
        if(A.empty()){
            mn = INF;
            mx = -INF;
            return;
        }
        C.clear(), F.clear();
        int n = A.size();
        C.resize(n), F.resize(n);
        mn = A[0][0], mx = A.back()[0];
        for(int i = n - 1; i >= 0;i--){
            int j = upper_bound(A.begin(), A.end(), ar<int,2>{A[i][0] + l, INF}) - A.begin();
            if(j == n)C[i] = 1, F[i] = A[i][0] + l;
            else C[i] = C[j] + 1, F[i] = F[j];
        }
    }

    ar<int,2> qry(int x){
        if(A.empty())return {0, x};
        int i = upper_bound(A.begin(), A.end(), ar<int,2>{x, INF}) - A.begin();
        if(i == A.size())return {0, x};
        return {C[i], F[i]};
    }
};

vector<Koce> B;


int n;

const int b = 700;

vector<ar<int,2> > A;
vector<int> ind;

void bld(vector<ar<int,2>> A){
    B.clear();
    for(int i = 0;i < n;i++){
        if(i % b == 0)B.push_back({});
        B.back().A.push_back(A[i]);
        ind[A[i][1]] = B.size() - 1;
    }
    for(auto &u: B)u.calc();
}

void rbld(){
    vector<ar<int,2>> v;
    int it = 0;
    for(auto u: B){
        for(auto x: u.A)v.push_back(x);
    }
    bld(v);
}

void init(int N, int L, int X[]){
    n = N;
    b = sqrt(n);
    ind.resize(n);
    l = L;
    for(int i = 0;i < n;i++)A.push_back({X[i], i});
    bld(A);


}

int cnt = 0;

int update(int i, int y){

    int j = ind[i];
    B[j].A.erase(find(B[j].A.begin(), B[j].A.end(), A[i]));
    B[j].calc();
    A[i][0] = y;
    bool f = 0;
    for(int x = 0; x < B.size();x++){
        if(B[x].A.empty())continue;
        if(y <= B[x].A.back()[0]){
            f = 1;
            B[x].A.insert(lower_bound(B[x].A.begin(), B[x].A.end(), A[i]), A[i]);
            ind[i] = x;
            B[x].calc();
            break;
        }
    }
    if(!f){
        B.back().A.push_back(A[i]);
        ind[i] = B.size() - 1;
        B.back().calc();
    }



    cnt++;
    if(cnt % b == 0)rbld();

    int x = -1;
    int ans = 0;
    for(auto u: B){
        auto [c, e] = u.qry(x);
        ans += c;
        x = e;
    }
    return ans;
}

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

elephants.cpp: In function 'void init(int, int, int*)':
elephants.cpp:76:7: error: assignment of read-only variable 'b'
   76 |     b = sqrt(n);
      |     ~~^~~~~~~~~