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

news/2024/7/7 20:03:56

题目链接


题目大意:

定义I(x,y)为x到y路径上最大值和最小值之差I(x,y)为x到y路径上最大值和最小值之差I(x,y)xy
现在叫你求∑i=1n∑j=inI(x,y)\sum_{i=1}^ {n}\sum_{j=i}^nI(x,y)i=1nj=inI(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
*/

http://lihuaxi.xjx100.cn/news/285992.html

相关文章

python-正则表达式练习题

因为方便看所以转载一篇博客园的的文章&#xff0c;非常不错 原文链接&#xff08;重要的事情说三遍&#xff09;&#xff1a; https://www.cnblogs.com/xiaxiaoxu/p/8436795.html https://www.cnblogs.com/xiaxiaoxu/p/8436795.html https://www.cnblogs.com/xiaxiaoxu/p/8436…

麻省理工深度学习基础公开课.ppt

编辑&#xff1a;计算机视觉联盟 转载于 &#xff1a;麻省理工学院- END -如果看到这里&#xff0c;说明你喜欢这篇文章&#xff0c;请转发、点赞。扫描下方二维码或者微信搜索「perfect_iscas」&#xff0c;添加好友后即可获得10套程序员全栈课程1000套PPT和简历模板&#xff…

百度15篇论文被AAAI 2019收录

1月27日&#xff0c;第33届 AAAI&#xff08;AAAI 2019&#xff09;在美国夏威夷召开&#xff0c;其中百度共有15篇论文被收录。AAAI于1979年成立&#xff0c;是国际人工智能领域的顶级国际会议。这一协会如今在全球已有超过6000名的会员&#xff0c;汇集了全球最顶尖的人工智能…

计算机、数学、运筹学等领域的32个重要算法

奥地利符号计算研究所&#xff08;Research Institute for Symbolic Computation&#xff0c;简称RISC&#xff09;的Christoph Koutschan博士在自己的页面上发布了一篇文章&#xff0c;提到他做了一个调查&#xff0c;参与者大多数是计算机科学家&#xff0c;他请这些科学家投…

图论刷水题记录(一)(最短路-----dijkstra算法)

最近实在不知道干些什么&#xff0c;感觉自己除了水题什么都不会做&#xff0c;算了去刷一刷图论的水题吧本来想合起来一起发&#xff0c;想了想太长的话以后看起来也不方便&#xff0c;题目所以今天晚上就先发了dij部分&#xff0c;由上到下由易变难。 1.POJ 2387 Til the Co…

图论 ---- E. Bear and Forgotten Tree 2(判补图的联通性技巧 图遍历的优化 条件拆分)

题目大意 题目大意&#xff1a; 给你nnn个点&#xff0c;mmm对关系表示(ai,bi)(a_i,b_i)(ai​,bi​)之间是没有边的问你能否构建出一颗树满足111号点的度数为kkk? 解题思路&#xff1a; 如果没有后面的条件就是判断这个图的补图的连通性&#xff1f; 但是怎么判呢&#xff1…

婚恋网手机认证接口

2019独角兽企业重金招聘Python工程师标准>>> source/control/user/certify.php <?php public function control_sendcheckcode( ) {$service parent::service( "certify", "us" );$mobile $service->validMobile( );unset( $service )…

图论 ---- F. Useful Edges(不等式移项优化预处理 + 路径和简单路径的区别 + 最短路)

题目链接 题目大意&#xff1a; 给出由 nnn 个点构成的无向图&#xff0c;再给出 qqq 个三元对 (u,v,l)( u , v , l )(u,v,l)&#xff0c;现在问有多少条边 (i,j)( i , j )(i,j) 可以和至少一个三元对匹配&#xff0c;可以匹配的条件是&#xff1a; 从点 uuu 到点 vvv 且包含…