首页 > 其他分享 >牛客小白月赛64 D-Karashi的树 I(dfs)

牛客小白月赛64 D-Karashi的树 I(dfs)

时间:2023-01-08 22:33:10浏览次数:147  
标签:int LL dfs Karashi 牛客 64 sum 排序 节点

https://ac.nowcoder.com/acm/contest/49244/D

  1. 每个点的价值是它到根节点的路径上所有节点的所有点权和(包括它自己)

  2. 点数其实也就是从根节点数 这棵子树有多少个子节点,这就是出现次数

  3. 显而易见所有点的权值都可以随便变化,没有规定变换次数,所以我们可以随意变换成我们想要的样子

  4. 所以直接排序依次把子树多的点安排在前面

  5. 答案就是排序后的价值和排序后的当前节点下子树的总节点数量相乘

输入 
9
3 5 3 4 6 1 5 1 6
1 2 2 2 1 6 6 8
输出
120
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=500200,M=2002;
//vector<LL> v[N];
//unordered_map<LL,LL> a[N];
//priority_queue<LL> pq;
//priority_queue<LL,vector<LL>,greater<LL>> pq2;
LL n,a[N],sum[N];
vector<LL> v[N];
void dfs(LL u,LL fa)
{
    sum[u]=1;
    for(int i=0;i<v[u].size();i++)
    {
        if(v[u][i]==fa) continue;
        dfs(v[u][i],u);
        sum[u]+=sum[v[u][i]];
    }
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        sort(a+1,a+1+n);
        for(int i=2;i<=n;i++)
        {
            LL x;
            cin>>x;
            v[x].push_back(i);
        }
        dfs(1,0);
        sort(sum+1,sum+1+n);
        LL ans=0;
        for(int i=1;i<=n;i++)
        {
            ans+=(LL)sum[i]*a[i];
        }
        cout<<ans<<endl;
    }
    return 0;
}

标签:int,LL,dfs,Karashi,牛客,64,sum,排序,节点
From: https://www.cnblogs.com/Vivian-0918/p/17035606.html

相关文章

  • 牛客进阶题目15:自动贩售机2
    跟上题基本类似,加了个sel选择`timescale1ns/1nsmoduleseller2( inputwireclk, inputwirerst, inputwired1, inputwired2, inputwiresel, ou......
  • 牛客进阶题目14:自动贩售机1
    用计数器对输入金额进行计数,大于等于1.5元时出货并找零。注意在出货的同时也可能投币,并且不支持同时投入三种货币`timescale1ns/1nsmoduleseller1( inputwireclk......
  • 牛客小白月赛64 C-Karashi的生日蛋糕(思维)
    https://ac.nowcoder.com/acm/contest/49244/C题目大意:Karashi决定将水果摆放成n圈,第i圈必须有i个水果。一共k个人,Karashi需要把蛋糕沿半径均分成k块,任意两块蛋糕包含......
  • leetcode-643-easy
    MaximumAverageSubarrayIYouaregivenanintegerarraynumsconsistingofnelements,andanintegerk.Findacontiguoussubarraywhoselengthisequalto......
  • 牛客进阶题目13:时钟分频(偶数)
    用计数器来翻转即可`timescale1ns/1nsmoduleeven_div(inputwirerst,inputwireclk_in,outputwireclk_out2,outputwir......
  • 牛客小白月赛65 D-牛牛取石子(博弈论)
    https://ac.nowcoder.com/acm/contest/49888/D题目大意:一共有两堆石子,第一堆a个,第二堆b个,牛牛(先手)和牛妹轮流取石子:2种方案种挑一种1.第一堆取1个,第二堆取2个2......
  • 4645. 选数异或
    4645.选数异或给定一个长度为n的数列A1,A2,⋅⋅⋅,An和一个非负整数x,给定m次查询,每次询问能否从某个区间[l,r]中选择两个下标不同的数使得他们的异或等于x。......
  • 牛客进阶题目12:重叠序列检测
    注意看波形,flag相对于data的输入延迟两拍。也就是在输入1011后,第一拍进行检测,第二拍拉高flag。`timescale1ns/1nsmodulesequence_test2( inputwireclk, inputw......
  • 牛客2022跨年场
    B.分赃首先统计只有一个的数字个数,如果是偶数就平均分给两个人,然后把剩下的数字全部分给任意一个人。如果是奇数个,就看时候有数字的数量大于三,如果有,就把这个数字的其中......
  • anydesk arm64
    sudodpkg--add-architecturearmhfsudoaptupdatesudoaptinstalllibpolkit-gobject-1-0:armhflibraspberrypi0:armhflibraspberrypi-dev:armhflibraspberrypi-b......