分析

我们对于每个子树的答案是可以预先知道的 ,那么如果 那么一定无解。之后我们可以直接遍历整个树得到 的节点。那么当这样的节点个数超过 的时候,这个树就是合法的,输出两个非树根的节点就可以了。那么总的复杂度为

代码

#include<bits/stdc++.h>
using namespace std;
int read() {int x=0,f=0;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}return f?-x:x;
}
const int N = 1e6 + 10;
vector<int> G[N],A;
int n,val[N],sum[N],Ans,rt;
void dfs(int x,int fa){
    sum[x]=val[x];for(auto y:G[x]){
        if(y==fa)continue;
        dfs(y,x);sum[x]+=sum[y];
    }if(sum[x]*3==Ans)A.push_back(x),sum[x]=0;
}
int main() {
    n=read();for(int i=1,a;i<=n;i++){
        a=read();val[i]=read();
        if(!a) rt=i;else {
            G[a].push_back(i);G[i].push_back(a);
        }
        Ans+=val[i];
    }
    if(Ans%3){cout<<"-1"<<endl;return 0;}
    dfs(rt,0);if(A.size()<=2) {cout<<"-1"<<endl;return 0;}
    cout<<A[0]<<" "<<A[1]<<endl;return 0;
}