Submission #1269738

#TimeUsernameProblemLanguageResultExecution timeMemory
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...