题解 P7124 【[Ynoi2008] stcm】
给出一个分治做法。
\texttt{Solution}
在 dfn 序上考虑,点
一个分治区间
考虑每一层分治处理完所有跨过区间中点
未跨过
对于分治的每一层,显然处理跨过区间中点
给出核心代码:
void solve(vec p,int l,int r,int d){
if(!p.size())return ;
if(l==r){printf("=%d",rdfn[l]);return ;}
int mid=l+((r-l)>>1);
vec lt,rt;lt.clear();rt.clear();
int lp=l-1,rp=r+1;
for(auto x:p){
if(R[x]<=mid)lt.eb(x);
else if(x>mid)rt.eb(x);
else{
while(lp<x-1)trans(rdfn[++lp]);
while(rp>R[x]+1)trans(rdfn[--rp]);
printf("=%d",rdfn[x]);
}
}
for(int i=lp;i>=l;i--)printf("-");
for(int i=rp;i<=r;i++)printf("-");
for(int i=mid+1;i<=r;i++)trans(rdfn[i]);
solve(lt,l,mid,d+1);
for(int i=mid+1;i<=r;i++)printf("-");
for(int i=l;i<=mid;i++)trans(rdfn[i]);
solve(rt,mid+1,r,d+1);
for(int i=l;i<=mid;i++)printf("-");
return ;
}