ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

在一起 (树的贡献问题) (2022湘潭大学竞赛)

2022-07-03 16:34:55  阅读:159  来源: 互联网

标签:sz 竞赛 val 湘潭 int dfs num 2022 ri


Submit Code - J - Codeforces

题目大意: 看上面.

思路:

  • 首先dfs一遍,得到各个节点的子数量和子贡献
  • 然后在dfs一遍,得到各个节点的总贡献
  • 如何更新: dfs下来,所以父亲的总贡献是得到的,然后VAL[A] = val[f] - val[a](这个节点) -sz[a]*w +val[a]+ (total sz - sz[a]) *w 
  • 最后这个是有多个测试数据一定要记得清零
  • 不仅仅数组,和一些其他的变量要清零, vector也要清0,(建图)!!,这次就是因为这个一直没有发现哪里错了,最骚的是那个样例是错的!!
#include <bits/stdc++.h>
using namespace std;
#define M 200005
#define ri register int

int n,m;
int T;
struct dian{
    int val,to;
};
vector <dian> p[M];
long long  sz[M],val[M],vis[M];
int num[M];
void dfs1(int a)
{
    vis[a]=1;
    sz[a]=num[a];
    for(ri i=0;i<p[a].size();i++)
    {
        int b=p[a][i].to;
        if(vis[b]) continue;
        dfs1(b);
        sz[a]+=sz[b];
        val[a]+=1ll*sz[b]*p[a][i].val+val[b];
    }
    
}
long long ans1,ans2;
long long arr=0;
void dfs2(int a,int f,int w)
{
    if(f==0)
    {
        ans1=1;ans2=val[1];
    }
    else
    {
        long long tmp=val[a];
        tmp+=val[f]-1ll*w*sz[a]-val[a];
        tmp+=(arr-sz[a])*w;
        val[a]=tmp;
        if(val[a]<ans2)
        {
            ans2=val[a];
            ans1=a;
        }
        else
        {
            if(val[a]==ans2&&a<ans1)
            {
                ans1=a;
            }
        }
    }
        vis[a]=1;
        for(ri i=0;i<p[a].size();i++)
        {
        int b=p[a][i].to;
        if(vis[b]) continue;
        dfs2(b,a,p[a][i].val);
        }
    
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    
    cin>>T;
    while(T--)
    {
        cin>>n;arr=0;
        for(ri i=1;i<=n;i++) cin>>num[i],arr+=num[i],p[i].clear();
        
        for(ri i=1;i<n;i++)
        {  
            int a,b,c;
            cin>>a>>b>>c;
            dian t;
            t.to=b;t.val=c;
            p[a].push_back(t);
            t.to=a;
            p[b].push_back(t);
        }
        for(ri i=1;i<=n;i++)
        {
            val[i]=0;vis[i]=0;
        }
        dfs1(1);
        for(ri i=1;i<=n;i++) vis[i]=0;
        dfs2(1,0,0);
        cout<<ans1<<" "<<ans2<<endl;
    }
    return 0;
    
    
} 
View Code

 

标签:sz,竞赛,val,湘潭,int,dfs,num,2022,ri
来源: https://www.cnblogs.com/Lamboofhome/p/16440033.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有