제출 #1331168

#제출 시각아이디문제언어결과실행 시간메모리
1331168kokokai밀림 점프 (APIO21_jumps)C++20
컴파일 에러
0 ms0 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
const int N = 2e5+5;
const int LG = 18;
int fir[N],lst[N];
int go[N][LG];
int a[N],pos[N];
int n,q;
struct node{
    int pos,mx;
}jump[N][LG];
struct segtree{
    vector<int> st[4*N];
    void build(int id,int l,int r,int a[]){
        if(l == r){
            st[id].push_back(a[l]);
            return;
        }
        int mid=(l+r)>>1;
        build(id<<1,l,mid,a);
        build(id<<1|1,mid+1,r,a);
        st[id]=st[id<<1];
        for(int v:st[id<<1|1]) st[id].push_back(v);
        sort(st[id].begin(),st[id].end());
    }
    int getmax(int id,int l,int r,int u,int v){
        if(r<u || v<l) return 0;
        if(u<=l && r<=v) return st[id].back();
        int mid=(l+r)>>1;
        return max(getmax(id<<1,l,mid,u,v),getmax(id<<1|1,mid+1,r,u,v));
    }
    int get(int id,int l,int r,int u,int v,int val){
        if(r<u || v<l) return 0;
        if(u<=l && r<=v){
            int t=lower_bound(st[id].begin(),st[id].end(),val)-st[id].begin()-1;
            if(t>=0) return st[id][t];
            else return 0;
        }
        int mid=(l+r)>>1;
        return max(get(id<<1,l,mid,u,v,val),get(id<<1|1,mid+1,r,u,v,val));
    }
}smt;
void init(int _n,vector<int> H){
    n=_n;
    for(int i=0;i<n;i++){
        a[i+1]=H[i];
    }
    for(int i=1;i<=n;i++) pos[a[i]]=i;
    a[0]=1e9;
    smt.build(1,1,n,a);
    //
    vector<int> st;
    for(int i=1;i<=n;i++){
        while(!st.empty() && a[st.back()] < a[i]) st.pop_back();
        if(st.size()) fir[i]=st.back();
        else fir[i]=0;
        st.push_back(i);
    }
    st.clear();
    for(int i=n;i>=1;i--){
        while(!st.empty() && a[st.back()] < a[i]) st.pop_back();
        if(st.size()) lst[i]=st.back();
        else lst[i]=0;
        st.push_back(i);
    }
    for(int i=1;i<=n;i++){
        if(!fir[i] && !lst[i]){
            jump[i][0]={(int)1e9,(int)1e9};
        }
        else if(!fir[i]){
            jump[i][0]={lst[i],max(i,lst[i])};
        }else if(!lst[i]){
            jump[i][0]={fir[i],max(i,fir[i])};
        }else{
            if(a[fir[i]] > a[lst[i]]) jump[i][0]={fir[i],max(i,fir[i])};
            else jump[i][0]={lst[i],max(i,lst[i])};
        }
        go[i][0]=lst[i];
        if(go[i][0] == 0) go[i][0]=1e9;
    }

    for(int lg=1;lg<LG;lg++){
        for(int i=1;i<=n;i++){
            if(go[i][lg-1] == 1e9) go[i][lg]=1e9;
            else{
                go[i][lg]=go[go[i][lg-1]][lg-1];
            }
        }
        for(int i=1;i<=n;i++){
            if(jump[i][lg-1].pos == (int)1e9) jump[i][lg]={(int)1e9,(int)1e9};
            else{
                jump[i][lg].pos=jump[jump[i][lg-1].pos][lg-1].pos;
                jump[i][lg].mx=max(jump[i][lg-1].mx,jump[jump[i][lg-1].pos][lg-1].mx);
            }
        }
    }

}
int minimum_jumps(int l,int r,int u,int v){
    ++l;++r;++u;++v;
    int maxuv=smt.getmax(1,1,n,u,v);
    int sta=smt.get(1,1,n,l,r,maxuv);
    sta=pos[sta];
    int lim=0;
    int p=sta;
    for(int lg=LG-1;lg>=0;lg--){
        if(jump[p][lg].pos > n || jump[p][lg].pos < 1) continue;
        if(a[jump[p][lg].pos] < maxuv){
            p=jump[p][lg].pos;
            lim += (1<<lg);
        }
    }

    int num=0;
    p=sta;
    for(int lg=LG-1;lg>=0;lg--){
        if(num+(1<<lg) <= lim){
            if(jump[p][lg].mx < u){
                p=jump[p][lg].pos;
                num += (1<<lg);
            }
        }
    }
    for(int lg=LG-1;lg>=0;lg--){
        if(go[p][lg] <= v){
            p=go[p][lg];
            num += (1<<lg);
        }
    }
    if(u <= p && p <= v){
        return num;
    }else return -1;

}
signed main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    if(fopen("text.inp","r")){
        //freopen("text.inp","r",stdin);
    }
    init(7, {3,2,1,6,4,5,7});
    cout<<minimum_jumps(0,1,2,2)<<'\n';
}

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

/usr/bin/ld: /tmp/ccyVeDX9.o: in function `main':
stub.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccazaduT.o:jumps.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status