题目链接


题目大意:

定义I(x,y)为x到y路径上最大值和最小值之差I(x,y)为x到y路径上最大值和最小值之差I(x,y)为x到y路径上最大值和最小值之差
现在叫你求∑i=1n∑j=inI(x,y)\sum_{i=1}^ {n}\sum_{j=i}^nI(x,y)i=1∑n​j=i∑n​I(x,y)


解题思路:

  1. 首先我们可以这么看对于一个点我们可以去看看假设这个点是路径上面的最大值,有多少条路径?然后我们再去看看这个点是多少路径上的最小值贡献相减就可以了!!
  2. 但是怎么求?我们可以把点按照权值进行升序排序,假设我们先把树给清空然后点一个个插进行当插进一个新的点的时候,我们发现这个树里面的点权值都比你现在插进来的点小!!
  3. 然后插入的点我们去访问周围的点,去统计路径就可以了
  4. 路径分两种:1.是一个块里面的路径,2是两个块直接的路径

AC code

#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = N;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {read(first);read(args...);
}inline void write(__int128 x) {if(x<0){putchar('-');x=-x;}if(x>9)write(x/10);putchar(x%10+'0');
}ll sum[2];
vector<int> G[maxn];
struct node {ll val;int id;
}arr[maxn];
bool cmpup(node a, node b) {return a.val < b.val;
}bool cmpdown(node a, node b) {return a.val > b.val;
}
int n;struct dsu {int fa[maxn], siz[maxn];bool vis[maxn];inline void init(int n) {for(int i = 1; i <= n; ++ i) vis[i] = 0, fa[i] = i, siz[i] = 1;}inline int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}inline void Union(int u, int v) {int fu = find(u), fv = find(v);if(fu == fv) return;fa[fu] = fv;siz[fv] += siz[fu];}
}dsu;void work(int idx) {for(int i = 1; i <= n; ++ i) {int id = arr[i].id;ll ans = 0;ll pre = 0;for(auto it : G[id]) {int fit = dsu.find(it);// cout << "it = " << it << " " << fit << " " << dsu.siz[fit] << endl;if(!dsu.vis[it]) continue;// 访问周围的点if(pre == 0) {pre = dsu.siz[fit]; } else {ans += dsu.siz[fit] * pre;pre += dsu.siz[fit];}}for(auto it : G[id]) if(dsu.vis[it]) dsu.Union(it,id); //合并点dsu.vis[id] = 1;sum[idx] += (ans + pre) * arr[i].val;// cout << sum[idx] << endl;}
}int main() {IOS;cin >> n;for(int i = 1; i <= n; ++ i) cin >> arr[i].val,arr[i].id = i;for(int i = 2; i <= n; ++ i) {int u, v;cin >> u >> v;G[u].push_back(v);G[v].push_back(u);}sort(arr+1,arr+1+n,cmpup);dsu.init(n);work(0);// cout << "---\n";// cout << sum[0] << endl;sort(arr+1,arr+1+n,cmpdown);dsu.init(n);work(1);cout << sum[0] - sum[1];// write(sum[0] - sum[1]);
}
/*
5
1 1 1 2 2
1 2
3 4
5 2
3 1
*/

树上动态插点 ---- F. Imbalance Value of a Tree(树上动态插点 + 并查集)相关推荐

  1. 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)

    题目链接 题目大意: 你有个点集合SSS,每次往集合里面加点或者删点(如果要加的点出现过),如果(x1,y1),(x2,y1),(x1,y2),(x2,y2)(x1,y1),(x2,y1),(x1,y ...

  2. HDU2545 树上战争【树+并查集】

    树上战争 Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  3. 2021年中国光分插复用器(OADM)市场趋势报告、技术动态创新及2027年市场预测

    光分插复用器(OADM)市场的企业竞争态势 该报告涉及的主要国际市场参与者有Patton.PacketLight Networks.Fiberroad Technology.Omnitron Syst ...

  4. 2017 西安网络赛A Tree(树上静态查询,带权并查集,矩阵乘法压位,好题)

    题目链接 题意: 给出 \(n(n \leq 3000)\) 个结点的一棵树,树上每个结点有一个 \(64 \times 64\) 的 \(0,1\)矩阵,每个结点上的矩阵是根据输入的 \(seed\ ...

  5. CF990G GCD Counting(树上莫比乌斯反演,分层图,并查集)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 给定一棵点带权无根树,对于每个 k∈[1,2×105]k\in[1,2\times10 ...

  6. [dsu on tree]树上启发式合并总结(算法思想及模板附例题练习)

    文章目录 前言 树上启发式合并 引入 算法思想 时间复杂度 模板 练习 例题:CF600E Lomsat gelral solution code CF208E Blood Cousins solut ...

  7. 动态图连通性(线段树分治+按秩合并并查集)

    在考场上遇到了这个的板子题,,,所以来学习了一下线段树分治 + 带撤销的并查集. 题目大意是这样的:有m个时刻,每个时刻有一个加边or撤销一条边的操作,保证操作合法,没有重边自环,每次操作后输出当前图 ...

  8. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )

    树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...

  9. HYSBZ - 2959 长跑(动态树+并查集)

    某校开展了同学们喜闻乐见的阳光长跑活动.为了能"为祖国健康工作五十年",同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动.一时间操场上熙熙攘攘,摩肩接踵,盛况 ...

最新文章

  1. memcached图形界面的监控
  2. 【shell】删除重复文件
  3. 蓝驰创投朱天宇:用10年尺度看 AI 创业,如何发现独角兽 | 新智元专访
  4. 35岁前务必成功的12级跳(男女通用) 转
  5. Node响应中文时解决乱码问题
  6. 上海大学c语言作业答案,《上海大学C语言选择题》.doc
  7. URL访问 和命名规范
  8. php 特有,PHP特殊数据类型有哪些?原来这门编程语言如此有趣
  9. AxureShare太慢?尝试在内网架设Axure共享吧!
  10. 【GIS开发】Esri Shapefile(.shp)矢量数据文件读取(C++、Python)
  11. 如何将图片批量转换成PDF?
  12. webkit未能加载文件或程序集WebKitBrowser
  13. 关于Kubernetes中API Server使用token、kubeconfig文件认证的一些笔记
  14. 高等数学-线性代数:特征向量与差分方程的连接
  15. k个一组翻转链表 哔哩哔哩2020校园招聘笔试题/LeetCode_25(困难)讲解
  16. 仅需三步,远程桌面控制公司内网电脑
  17. 知乎里怎么看个人简介_如何做一份优秀的简历?
  18. 全屏时钟软件Linux,翻页时钟下载-翻页时钟安卓版下载v1.2.3-Linux公社
  19. [附源码]计算机毕业设计JAVA壹家吃货店网站
  20. POI导出Excel,公式不能自动计算

热门文章

  1. MATLAB_7-彩色图像【长长的笔记!】车牌放在文章末尾有链接
  2. CMD命令,常驻内存的与外部的介绍 还有CMD格式化
  3. 如何在 Python 中开始机器学习?(小白必看)
  4. pytest文档21-pytest-html报告优化(nodeid中文显示[\u6350\u52a9\u6211\u4eec]问题解决)
  5. 教您如何查看MySQL用户权限
  6. Ubuntu 17 安装sublime
  7. solr5.5.4 添加mysql数据,实现同步更新
  8. Sonatype收购Vor Security,扩展对Nexus开源组件的支持
  9. 使用Composer安装Laravel步骤
  10. c10k问题及其解决方案