套娃这个题,其实只要统计他需要打开几次,还有要合上几次就好,一开始做一个标记,记录下每一个套娃的父亲,然后,比不同,把要发生变化的位置的套娃都拆开,就可以了,最后统计一下需要合上的,最后在统计一下,想要的和改变后的区别,想要的有的,改变后没有的就是需要再加上的。
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100000 + 10;
int a[maxn],b[maxn],fa[maxn],ce[maxn];
int n;
int ans;
void dfs2(int x)
{
if(fa[x] == 0)
return;
ans++;
dfs2(fa[x]);
fa[x] = 0;
return;
}
int main()
{
while(scanf("%d",&n) != EOF)
{
ans = 0;
memset(ce,-1,sizeof(ce));
memset(fa,0,sizeof(fa));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
fa[i] = a[i];
if(!fa[i])
ce[i] = 0;
}
for(int i = 1; i <= n; i++)
{
scanf("%d",&b[i]);
}
for(int i = 1; i <= n; i++)
{
if(a[i] != b[i])
{
dfs2(a[i]);
dfs2(b[i]);
dfs2(i);
}
}
for(int i = 1; i <= n; i++)
{
if(b[i] != fa[i] && b[i] > 0)
ans++;
}
printf("%d\n",ans);
}
return 0;
}