题目
给定一个n(n<=2e5),给定一个长为n的排列A和一个长为n的排列B,
你需要判断是否上述两个序列可以构造出一棵树,
使得A是以A1为根的一个合法的topo序列,B是以B1为根的一个合法的dfs序列
思路来源
官方题解
题解
题目是好idea的题,题解思路也很清奇,女少口阿
但我还是很羡慕乱搞AC的那些人
可以发现这样构造,
①topo更小的连向了之前已经连好的一坨,每次会从topo更小的先往后扩展,
又最后从topo序1号开始扩展,数学归纳知都合法
②dfs序,从后往前构造,实际动态维护了一条链,链尾作后来点的父亲,
这样搜的时候,链上后作父亲的点v一定可以保证在链上先作父亲点的u之后搜到,
且[u,v]这之间的非链上的点,都作菊花图一般,挂在了u上,可以被指定按区间序搜
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,cur,a[N],b[N],pos[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
pos[a[i]]=i;
}
for(int i=1;i<=n;++i){
scanf("%d",&b[i]);
}
puts("YES");
cur=b[1];
for(int i=2;i<=n;++i){
printf("%d %d\n",cur,b[i]);
if(pos[b[i]]<pos[cur]){
cur=b[i];
}
}
return 0;
}