链接
题意:
思路:
这题考察了dfs序的问题,第二棵树要满足在不同子树,也就是dfs序他们不能相交。第一棵树很容易想到只能是一条链上的某些节点,那么我们先按照dfs序建出第二棵树,然后贪心的用set来维护第一棵树,set是来维护该节点在第二棵树上的L,R区间,我们每次贪心的来维护,如果上面的点覆盖了当前的区间,那肯定是区间小的更优秀。
代码:
//#pragma GCC target("avx")
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize("Ofast")
// created by myq
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long ll;
#define x first
#define y second
typedef pair<int,int> pii;
const int N = 300010;
const int mod=998244353;
int h[N],e[N],ne[N],idx,cnt,L[N],R[N];
vector<int>v[N];
struct node{
int x;
node()
{
}
node(int _x)
{
x=_x;
}
bool operator<(const node&w)const
{
if(L[x]!=L[w.x]) return L[x]<L[w.x];
return R[x]<R[w.x];
}
};
set<node>s;
int ans;
int n;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs1(int u)
{
L[u]=++cnt;
for(auto j:v[u])
{
// int j=e[i];
dfs1(j);
}
R[u]=cnt;
}
void dfs2(int u)
{
// if(s.lower_bound())
auto it=s.lower_bound(node(u));
int id=0;
if(it==s.begin())
{
if(L[it->x]==L[u] && R[it->x]>=R[u])
{
id=it->x;
s.erase(it);
s.insert(node(u));
}
else
{
s.insert(node(u));
}
}
else
{
it--;
if(R[it->x]>=L[u])
{
id=it->x;
s.erase(it);
s.insert(node(u));
}
else
s.insert(node(u));
}
ans=max(ans,(int)s.size());
for(int i=h[u];~i;i=ne[i])
{
int j=e[i];
dfs2(j);
}
if(id) s.insert(node(id));
s.erase(node(u));
}
void clear()
{
idx=0;
cnt=0;
for(int i=1;i<=n;i++) h[i]=-1,v[i].clear();
s.clear();
ans=0;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
memset(h,-1,sizeof h);
int t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=2;i<=n;i++)
{
int x;
cin>>x;
add(x,i);
}
for(int i=2;i<=n;i++)
{
int x;
cin>>x;
v[x].push_back(i);
}
dfs1(1);
dfs2(1);
cout<<ans<<"\n";
clear();
}
return 0;
}
/**
* In every life we have some trouble
* When you worry you make it double
* Don't worry,be happy.
**/