zoukankan      html  css  js  c++  java
  • Codeforces 915 F. Imbalance Value of a Tree(并查集)

    F. Imbalance Value of a Tree

    题意:
    给一颗带点权的树,求所有简单路径上最大点权和最小点权之差的总和。
    思路:
    所求问题可以看作求各路径上的最大值之和减各路径上的最小值之和。因此考虑每个点权的贡献次数,也就是他们成为最值的次数。
    以求最大值之和为例分析问题,我们可以从最小点权开始统计,每次将最小点加入。这样做的好处是每次取出的点,一定是当前已取出点中最大的,即当前任何经过该点的路径的最大值一定是它。已加入的点用并查集来维护连通块大小,以便于统计。该点所在连通块和与该点相连的连通块的大小相乘,可以求出这两个块经过该点的路径条数,然后将相连的块合并到该点所在的块,与下一个相连的连通块再继续做同样的处理。按点权从小到大的顺序,对每个点这样处理即可算出每个点成为最大值的次数。
    求最小值之和同理。
    代码:

    #include<bits/stdc++.h>
    #define dd(x) cout<<#x<<" = "<<x<<" "
    #define de(x) cout<<#x<<" = "<<x<<"
    "
    #define sz(x) int(x.size())
    #define All(x) x.begin(),x.end()
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    using namespace std;
    typedef long long ll;
    typedef long double ld;
    typedef pair<int,int> P;
    typedef priority_queue<int> BQ;
    typedef priority_queue<int,vector<int>,greater<int> > SQ;
    const int maxn=1e6+10,mod=1e9+7,INF=0x3f3f3f3f;
    vector<int> G[maxn];
    P w[maxn];  
    ll sum[maxn],fa[maxn];
    bool vis[maxn];
    void init(int n)
    {
    	for (int i=1;i<=n;++i)
    		fa[i]=i,sum[i]=1,vis[i]=0;
    }
    int find(int x)
    {
    	return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    ll unio(int u)
    {
    	ll tmp=0;
    	for (auto& v:G[u])
    	{
    		if (!vis[v])
    			continue;
    		int fv=find(v);
    		tmp+=sum[fv]*sum[u];
    		fa[fv]=u,sum[u]+=sum[fv];
    	}
    	return tmp;
    }
    int main()
    {
    	int n;
    	cin>>n;
    	for (int i=1;i<=n;++i)
    	{
    		scanf("%d",&w[i].fi);
    		w[i].se=i;
    	}
    	for (int i=1;i<n;++i)
    	{
    		int u,v;
    		scanf("%d%d",&u,&v);
    		G[u].pb(v);
    		G[v].pb(u);
    	}
    	sort(w+1,w+1+n);
    	ll ans=0;
    	init(n);
    	for (int i=1;i<=n;++i)
    	{
    		ans+=unio(w[i].se)*w[i].fi;
    		vis[w[i].se]=1;
    	}
    	init(n);
    	for (int i=n;i;--i)
    	{
    		ans-=unio(w[i].se)*w[i].fi;
    		vis[w[i].se]=1;
    	}
    	cout<<ans;
    	return 0;
    }
    
  • 相关阅读:
    国内比较优秀的.net论坛源代码收集 [转]
    WEB项目的分拆和布署[转载]
    采用XHTML和CSS设计可重用可换肤的WEB站点
    定时提醒小程序:VBScript
    小集正则表达式
    OO的设计原则
    在.Net内部, 异步委托是如何使用多线程功能的?
    Asp.net工作流程
    漫谈面向对象基石之开闭原则(OCP)(转)
    SQL Server 2008事务日志的[RowLog Contents 0] 字段没人能解析出来?
  • 原文地址:https://www.cnblogs.com/orangee/p/10322480.html
Copyright © 2011-2022 走看看