F. Imbalance Value of a Tree



题意:

给一颗带点权的树,求所有简单路径上最大点权和最小点权之差的总和。

思路:

所求问题可以看作求各路径上的最大值之和减各路径上的最小值之和。因此考虑每个点权的贡献次数,也就是他们成为最值的次数。

以求最大值之和为例分析问题,我们可以从最小点权开始统计,每次将最小点加入。这样做的好处是每次取出的点,一定是当前已取出点中最大的,即当前任何经过该点的路径的最大值一定是它。已加入的点用并查集来维护连通块大小,以便于统计。该点所在连通块和与该点相连的连通块的大小相乘,可以求出这两个块经过该点的路径条数,然后将相连的块合并到该点所在的块,与下一个相连的连通块再继续做同样的处理。按点权从小到大的顺序,对每个点这样处理即可算出每个点成为最大值的次数。

求最小值之和同理。

代码:

#include<bits/stdc++.h>
#define dd(x) cout<<#x<<" = "<<x<<" "
#define de(x) cout<<#x<<" = "<<x<<"\n"
#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;
}

Codeforces 915 F. Imbalance Value of a Tree(并查集)的更多相关文章

  1. 【CodeForces】915 F. Imbalance Value of a Tree 并查集

    [题目]F. Imbalance Value of a Tree [题意]给定n个点的带点权树,求所有路径极差的和.n,ai<=10^6 [算法]并查集 [题解]先计算最大值的和,按点权从小到大 ...

  2. CF915F Imbalance Value of a Tree (并查集)

    题目大意:给你一棵树,每个点有点权a_{i},求$\sum _{i=1}^{n} \sum _{j=i}^{n} f(i,j)$,$f(i,j)$表示i,j,路径上的点的最大权值-最小权值 正解的思路 ...

  3. [Swust OJ 856]--Huge Tree(并查集)

    题目链接:http://acm.swust.edu.cn/problem/856/ Time limit(ms): 1000 Memory limit(kb): 10000 Description T ...

  4. Educational Codeforces Round 64 (Rated for Div. 2)D(并查集,图)

    #include<bits/stdc++.h>using namespace std;int f[2][200007],s[2][200007];//并查集,相邻点int find_(in ...

  5. Codeforces 699D Fix a Tree 并查集

    原题:http://codeforces.com/contest/699/problem/D 题目中所描述的从属关系,可以看作是一个一个块,可以用并查集来维护这个森林.这些从属关系中会有两种环,第一种 ...

  6. Codeforces Round #363 (Div. 2)D. Fix a Tree(并查集)

    D. Fix a Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  7. Codeforces Round #363 (Div. 2) D. Fix a Tree —— 并查集

    题目链接:http://codeforces.com/contest/699/problem/D D. Fix a Tree time limit per test 2 seconds memory ...

  8. Hdu.1325.Is It A Tree?(并查集)

    Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  9. HDU 5606 tree 并查集

    tree 把每条边权是1的边断开,发现每个点离他最近的点个数就是他所在的连通块大小. 开一个并查集,每次读到边权是0的边就合并.最后Ans​i​​=size[findset(i)],size表示每个并 ...

随机推荐

  1. table html

    <html><head><title>demo-110101</title><style type="text/css"> ...

  2. winForm入门学习

    Windows窗体 属性: name:对象的名称 windowsState:初始化窗体的大小,Normal,Minimized,Maximized StartPosition:窗体起始位置,Manua ...

  3. linux grep/awk/cut/egrep/echo/经验

    1. 例子 http://www.test.com/atk/pki/test-1.1.tar.gz 过滤出test-1.1.tar.gz t = http://www.test.com/atk/pki ...

  4. git冲突Pull is not possible because you have unmerged files

    本地的push和merge会形成MERGE-HEAD(FETCH-HEAD), HEAD(PUSH-HEAD)这样的引用.HEAD代表本地最近成功push后形成的引用.MERGE-HEAD表示成功pu ...

  5. Redis的最常见面试问题

    Redis的那些最常见面试问题[转] 1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据 ...

  6. 把app(apk和ipa文件)安装包放在服务器上供用户下方法

    怎么把app(apk和ipa文件)安装包放在服务器上供用户下载? IIS服务器网站不能下载.apk文件的原因:IIS的默认MIME类型中没有.apk文件,所以无法下载.解决办法:给.apk格式文件添加 ...

  7. 切记:永远不要在MySQL中使用UTF-8

    MySQL使用UTF-8 issue 问题描述:最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误: Incorrec ...

  8. C# 一个数组集合,任意组合,不遗漏,不重复

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  9. python学习笔记:安装boost python库以及使用boost.python库封装

    学习是一个累积的过程.在这个过程中,我们不仅要学习新的知识,还需要将以前学到的知识进行回顾总结. 前面讲述了Python使用ctypes直接调用动态库和使用Python的C语言API封装C函数, C+ ...

  10. web开发:Bootstrap应用及内存管理

    一.栅格系统 二.移动端适配 三.栅格系统案例 四.表格 五.表单 六.循环应用 一.栅格系统 <!DOCTYPE html> <html> <head> < ...