关于 Spartacus 的 sitemap.xml 问
368 2023-04-03 04:21:06
题面
这个题相当于是把每个数的值作为 \(x_i\),在原序列中的位置为 \(y_i\),建出笛卡尔树,直接输出先序遍历(字典序最小)即可。
#include<iostream>#include<cstdio>using namespace std;inline int rd(){int res=0;char c=getchar();for(;!isdigit(c);c=getchar());for(;isdigit(c);c=getchar())res=(res<<1)+(res<<3)+(c-'0');return res;}const int N=1e5+13;int n,a[N],s[N],top,L[N],R[N];void dfs(int u){printf("%d ",u);if(L[u]) dfs(L[u]);if(R[u]) dfs(R[u]);}int main(){n=rd();int rt=0;for(int i=1,x;i<=n;++i) x=rd(),a[x]=i;for(int i=1;i<=n;++i){int pos=top;while(pos&&a[s[pos]]>a[i]) --pos;if(pos) R[s[pos]]=i;if(pos<top) L[i]=s[pos+1];s[top=(++pos)]=i;}dfs(s[1]);return 0;}