#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,w[N],p[N],dep[N],sz[N];
vector<int> vec[N];
inline void dfs(int u)
{
sz[u]=1;dep[u]=dep[p[u]]+1;
for(auto x:vec[u]) dfs(x),sz[u]+=sz[x];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
for(int i=2;i<=n;i++) scanf("%d",&p[i]),vec[p[i]].push_back(i);
dfs(1);for(int i=1;i<=n;i++) p[i]=i;
sort(p+1,p+n+1,[](int a,int b){return sz[a]-w[a]-dep[a]>sz[b]-w[b]-dep[b];});
long long ans=0;
for(int i=1;i<=n;i++) if(i&1) ans+=sz[p[i]]-w[p[i]]-dep[p[i]];
printf("%lld",ans);
return 0;
}
这份代码在 C++14 (GCC 9) 能过,但在 C++98 下 CE。
sort(p+1,p+n+1,[](int a,int b){return sz[a]-w[a]-dep[a]>sz[b]-w[b]-dep[b];});
sort(p+1,p+n+1,[](int a,int b){return sz[a]-w[a]-dep[a]>=sz[b]-w[b]-dep[b];});
并且只要将上面那句改成下面就会RE。
其实我是不能理解的。。。