其他分享
首页 > 其他分享> > C. Garland 找规律找规律找规律

C. Garland 找规律找规律找规律

作者:互联网

首先如果不为3的倍数肯定无解

如果为3的倍数

dfs查找每个点作为根的子树和

遇到一个满足和为sum/3的就删去

正确性:

可能会有很多个这样的点,他们之间的切割方式可以排列组合,要不要记录谁先割啥的,dp?

不,因为每个点其实都是一样的,对于两个合法的点之间..它们和为0,这段就没贡献,不影响。

:

#include<bits/stdc++.h>
using namespace std;
int cnt=0,n,sum[2000000],a[2000000],ave;
vector <int> g[2000000],ans;
void dfs(int x)
{
    sum[x]=a[x];
    for(auto v:g[x])
    {
        dfs(v);
        sum[x]+=sum[v];
    }
    if(sum[x]==ave) ans.push_back(x),sum[x]=0;
}
int main()
{
       cin>>n;
       
       int root,tot=0;
       
       for(int i=1;i<=n;i++)
       {
              int fa,w;
              scanf("%d%d",&fa,&w);
              tot+=w;
              a[i]=w;
           g[fa].push_back(i);
              if(fa==0) root=i;
    }
    
    if(tot%3!=0)
    {
        cout<<"-1";return 0;
    }
    
    ave=tot/3;
    dfs(root);
    
    if(ans.size()<3)
    {
        cout<<"-1";return 0;
    }
    
    cout<<ans[0]<<" "<<ans[1];
}

 

标签:规律,Garland,int,sum,dfs,ans,ave,2000000
来源: https://www.cnblogs.com/liyishui2003/p/15565427.html