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];
}

 

上一篇:boost::units模块单位/数量操作和转换的测试程序


下一篇:session实现购物车