제출 #1269738

#제출 시각아이디문제언어결과실행 시간메모리
1269738warrennFloppy (RMI20_floppy)C++20
100 / 100
70 ms4844 KiB
#include <stdlib.h>
#include <string.h>
#include<bits/stdc++.h>
using namespace std;
#include "floppy.h"

const int maxn=4e4;

int lf[maxn+2],rg[maxn+2],chl[maxn+2],chr[maxn+2];

void dfs(int cur,string &bits){
    bits+=((chl[cur]!=-1) + '0');
    bits+=((chr[cur]!=-1) + '0');
    if(chl[cur]>=0){
        dfs(chl[cur],bits);
    }
    if(chr[cur]>=0){
        dfs(chr[cur],bits);
    }
}

void read_array(int subtask_id, const std::vector<int> &v) {
    int n=v.size();

    string bits="";
    stack<int>st;
    for(int q=0;q<n;q++){
        chl[q]=chr[q]=-1;
        while(st.size() && v[st.top()]<v[q]){
            st.pop();
        }
        if(st.empty()){
            lf[q]=-1;
        }
        else{
            lf[q]=st.top();
        }
        st.push(q);
    }
    while(st.size())st.pop();
    for(int q=n-1;q>=0;q--){
        while(st.size() && v[st.top()]<v[q]){
            st.pop();
        }
        if(st.empty()){
            rg[q]=n+1;
        }
        else{
            rg[q]=st.top();
        }
        st.push(q);
    }
    int root;
    for(int q=0;q<n;q++){
        if(lf[q]==-1 && rg[q]==n+1){
            root=q;
        }
        else if(lf[q]==-1){
            chl[rg[q]]=q;
        }
        else if(rg[q]==n+1){
            chr[lf[q]]=q;
        }
        else{
            if(v[lf[q]]<v[rg[q]]){
                chr[lf[q]]=q;
            }
            else{
                chl[rg[q]]=q;
            }
        }
        
    }
    dfs(root,bits);
    save_to_floppy(bits);
}

int idx[maxn+2],dep[maxn+2];

void dfs2(int &cur,int &cnt, const string &bits,int jrk){
    dep[cur]=jrk;
    bool kiri=(bits[2*cur]=='1');
    bool kanan=(bits[2*cur+1]=='1');

    int tmp=cur;
    if(kiri){
        cur++;
        dfs2(cur,cnt, bits,jrk+1);
    }
    idx[tmp]=cnt;
    cnt++;
    if(kanan){
        cur++;
        dfs2(cur,cnt,bits,jrk+1);
    }

}

vector<pair<int,int> >st;

pair<int,int> merg(pair<int,int>a,pair<int,int>b){
    if(a.first<b.first)return a;
    return b;
}

void update(int idx,int l,int r,int pos,int val){
    if(l==r){
        st[idx].first=val;
        st[idx].second=l;
        return ;
    }
    int mid=(l+r)/2;
    if(mid>=pos)update(2*idx,l,mid,pos,val);
    else update(2*idx+1,mid+1,r,pos,val);
    st[idx]=merg(st[2*idx],st[2*idx+1]);
}

pair<int,int> query(int idx,int l,int r,int posl,int posr){
    if(l>=posl && r<=posr)return st[idx];
    if(l>posr || r<posl)return {1e9,0};
    int mid=(l+r)/2;
    return merg(query(2*idx,l,mid,posl,posr),query(2*idx+1,mid+1,r,posl,posr));
}

vector<int> solve_queries(int subtask_id, int n,const string &bits,const vector<int> &a, const vector<int> &b) {
    int cnt=0;
    int cur=0;
    dfs2(cur,cnt,bits,0);
    st=vector<pair<int,int> >(4*n+1);
    for(int q=0;q<n;q++){
        update(1,0,n-1,idx[q],dep[q]);
        //cout<<query(1,0,n-1,idx[q],idx[q]).first<<endl;
    }

    vector<int>ans;
    for(int q=0;q<a.size();q++){
        ans.push_back(query(1,0,n-1,a[q],b[q]).second);
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...