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<<"\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(并查集)的更多相关文章
- 【CodeForces】915 F. Imbalance Value of a Tree 并查集
[题目]F. Imbalance Value of a Tree [题意]给定n个点的带点权树,求所有路径极差的和.n,ai<=10^6 [算法]并查集 [题解]先计算最大值的和,按点权从小到大 ...
- CF915F Imbalance Value of a Tree (并查集)
题目大意:给你一棵树,每个点有点权a_{i},求$\sum _{i=1}^{n} \sum _{j=i}^{n} f(i,j)$,$f(i,j)$表示i,j,路径上的点的最大权值-最小权值 正解的思路 ...
- [Swust OJ 856]--Huge Tree(并查集)
题目链接:http://acm.swust.edu.cn/problem/856/ Time limit(ms): 1000 Memory limit(kb): 10000 Description T ...
- 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 ...
- Codeforces 699D Fix a Tree 并查集
原题:http://codeforces.com/contest/699/problem/D 题目中所描述的从属关系,可以看作是一个一个块,可以用并查集来维护这个森林.这些从属关系中会有两种环,第一种 ...
- 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 ...
- 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 ...
- 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 ...
- HDU 5606 tree 并查集
tree 把每条边权是1的边断开,发现每个点离他最近的点个数就是他所在的连通块大小. 开一个并查集,每次读到边权是0的边就合并.最后Ansi=size[findset(i)],size表示每个并 ...
随机推荐
- 以前面试 经常写这种 问掉的 copy 还是 =
get的时候,生成的 那个对象赋值给aa 生成的对象在这条语句完 就析构了: https://blog.csdn.net/qq_31759205/article/details/80544468h ...
- js中数组方法及分类
数组的方法有很多,这里简单整理下常用的21种方法,并且根据它们的作用分了类,便于记忆和理解. 根据是否改变原数组,可以分为两大类,两大类又根据不同功能分为几个小类 一.操作使原数组改变 1.数组的 ...
- HTML Ueditor加载空白问题
问题描述 Ueditor打开时加载不出内容 原因分析 Ueditor重复加载时,会存在缓存问题 Ueditor采用异步加载方式,所以数据获取和赋值要写在Ueditor异步回调里 解决方案 UE.del ...
- 智能指针原理及实现(1)shared_ptr
0.异常安全 C++没有内存回收机制,每次程序员new出来的对象需要手动delete,流程复杂时可能会漏掉delete,导致内存泄漏.于是C++引入智能指针,可用于动态资源管理,资源即对象的管理策略. ...
- openresty 阶段说明
开发中常用的7阶段 set_by_lua*: 流程分支处理判断变量初始化 rewrite_by_lua*: 转发.重定向.缓存等功能(例如特定请求代理到外网) access_by_lua*: IP 准 ...
- Nagios4.x安装配置总结
1. Nagios介绍 Nagios是一个监视系统运行状态和网络信息的监视系统.Nagios能监视所指定的本地或远程主机以及服务,同时提供异常通知功能等. Nagios可运行在Linux/Unix平 ...
- Django:forms局部函数、cookie、sesion、auth模块
一.forms组件 二.cookie和session组件 三.auth组件 一.forms组件 1.校验字段功能 针对一个实例:注册用户讲解 模型:models class UserInfo(mode ...
- 用命令行的方式把jmeter结果文件JTL生成csv格式的聚合报告
我们知道 利用jmeter 的GUI的 Aggragate Listner 很容易把一个JTL 文件另存为CSV 文件,该CSV 文件中自动分析了 Transactions 的 90%, Median ...
- 一图一知-TS之Interface接口
- java中的集合总结
知识点: 集合框架和List.set.Map相关集合特点的描述 Collection接口常用方法,List中相对Collection新增的方法,Collection的遍历(一般for循环,增强for循 ...