Codeforces Round #582 (Div. 3)-G. Path Queries-并查集


【Problem Description】

给你一棵树,求有多少条简单路径\((u,v)\),满足\(u\)到\(v\)这条路径上的最大值不超过\(k\)。\(q\)次查询。

【Solution】

并查集

将所有边按权值从小到大排序,查询值\(k_i\)也从小到大排序。对于每次查询的值\(k_i\),将边权小于等于\(k_i\)的边通过并查集合并在一起。对于合并后的联通块,每个联通块对答案的贡献为\(\frac{size\times(size-1)}{2}\),所有联通块的贡献直接求和即可。所以每次合并两个节点时,先将这两个节点所在的联通块的贡献减去,再加上合并后的贡献即可。


【Code】

/*
* @Author: Simon
* @Date: 2019-09-07 10:00:30
* @Last Modified by: Simon
* @Last Modified time: 2019-09-07 10:29:11
*/
#include<bits/stdc++.h>
using namespace std;
typedef int Int;
#define int long long
#define INF 0x3f3f3f3f
#define maxn 200005
struct node{
int u,v,w;
node(){}
node(int u,int v,int w):u(u),v(v),w(w){}
bool operator <(const node&a)const{
return w<a.w;
}
}g[maxn],q[maxn];
int Set[maxn],Rank[maxn];
void init(int n){ //初始化
for(int i=0;i<=n;i++){
Set[i]=i;Rank[i]=1;
}
}
int cal(int x){ //计算联通块的贡献
return x*(x-1)/2;
}
int Find(int u){ //并查集的查找根节点
return Set[u]==u?u:Set[u]=Find(Set[u]);
}
int res=0;
int ans[maxn];
void merge(int u,int v){ //并查集的合并
u=Find(u),v=Find(v);
if(Rank[u]<Rank[v]) swap(u,v);
res-=cal(Rank[u]),res-=cal(Rank[v]); //减去u,v所在联通块的贡献
Set[v]=u;Rank[u]+=Rank[v]; //合并两个联通块
res+=cal(Rank[u]); //再加上合并后的联通块的贡献
}
Int main(){
#ifndef ONLINE_JUDGE
//freopen("input.in","r",stdin);
//freopen("output.out","w",stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0); int n,m;cin>>n>>m;init(n);
for(int i=1;i<n;i++){
cin>>g[i].u>>g[i].v>>g[i].w;
}
sort(g+1,g+n);
for(int i=1;i<=m;i++){
cin>>q[i].w;q[i].u=i;
}
sort(q+1,q+m+1);
int pos=1;
for(int i=1;i<=m;i++){
while(pos<n&&g[pos].w<=q[i].w){
merge(g[pos].u,g[pos].v);
pos++;
}
ans[q[i].u]=res;
}
for(int i=1;i<=m;i++) cout<<ans[i]<<" \n"[i==m];
#ifndef ONLINE_JUDGE
cout<<endl;system("pause");
#endif
return 0;
}

Codeforces Round #582 (Div. 3)-G. Path Queries-并查集的更多相关文章

  1. Codeforces Round #582 (Div. 3) G. Path Queries (并查集计数)

    题意:给你带边权的树,有\(m\)次询问,每次询问有多少点对\((u,v)\)之间简单路径上的最大边权不超过\(q_i\). 题解:真的想不到用最小生成树来写啊.... 我们对边权排序,然后再对询问的 ...

  2. Codeforces Round #245 (Div. 2) B. Balls Game 并查集

    B. Balls Game Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/430/problem ...

  3. Codeforces Round #345 (Div. 1) E. Clockwork Bomb 并查集

    E. Clockwork Bomb 题目连接: http://www.codeforces.com/contest/650/problem/E Description My name is James ...

  4. Codeforces Round #345 (Div. 2) E. Table Compression 并查集

    E. Table Compression 题目连接: http://www.codeforces.com/contest/651/problem/E Description Little Petya ...

  5. Codeforces Round #603 (Div. 2) D. Secret Passwords 并查集

    D. Secret Passwords One unknown hacker wants to get the admin's password of AtForces testing system, ...

  6. Codeforces Round #600 (Div. 2) D题【并查集+思维】

    题意:给你n个点,m条边,然后让你使得这个这个图成为一个协和图,需要加几条边.协和图就是,如果两个点之间有一条边,那么左端点与这之间任意一个点之间都要有条边. 思路:通过并查集不断维护连通量的最大编号 ...

  7. Codeforces Round #345 (Div. 2) E. Table Compression 并查集+智商题

    E. Table Compression time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  8. Codeforces Round #600 (Div. 2) - D. Harmonious Graph(并查集)

    题意:对于一张图,如果$a$与$b$连通,则对于任意的$c(a<c<b)$都有$a$与$c$连通,则称该图为和谐图,现在给你一张图,问你最少添加多少条边使图变为和谐图. 思路:将一个连通块 ...

  9. Codeforces Round #345 (Div. 1) C. Table Compression (并查集)

    Little Petya is now fond of data compression algorithms. He has already studied gz, bz, zip algorith ...

随机推荐

  1. 01点睛Spring4.1-依赖注入

    转载:https://www.iteye.com/blog/wiselyman-2210252 1.1 声明bean 使用上例建立的testMavenSpring项目,将pom.xml文件中的 < ...

  2. Charles 手机抓包HTTPS设置以及证书安装

    本文参考:charles 抓包手机 charles经常会进行手机上的网页抓包,比如去copy别人网站图片或脚本的时候o(∩_∩)o : 手机抓包的原理,和PC类似,手机依靠charles与服务端进行对 ...

  3. Samba访问控制smb.conf

    访问控制 Samba的访问控制通过hosts allow(配置允许访问的客户端).hosts deny(配置拒绝访问的客户端)两个参数实现. 在Samba中使用hosts allow.hosts de ...

  4. 《Netty实战》源码运行及本地环境搭建

     1.源码路径: GitHub - zzzvvvxxxd/netty-in-action-cn: Netty In Action 中文版 ,中文唯一正版<Netty实战>的代码清单 下载后 ...

  5. 【MPEG】DVB / ATSC / ISDB区别

    硬件的区别: 欧洲“DVB标准”和美国“ATSC数字电视标准”的主要区别如下: (1)方形像素:在ATSC标准中采纳了“方形像素”(Square Picture Eelements),因为它们更加适合 ...

  6. idea设置创建类的注释模板

    打开settings>>Editor>>File and Code Templates>>Includes>>File Header

  7. js删除json指定元素

    var obj = {‘id’:1, ‘name’:‘张三’}; delete obj.id; // 或者 delete obj[id];

  8. PHP 数据库连接

    $db = new MySQLi("localhost","root","123","php0307"); !mysql ...

  9. publish dotnet core angular spa app to docker

    公司一个使用Angular开发的应用准备下个版本使用.Net Core开发后台, 刚好可以用到.Net Core Angular Spa模板, 而且最近也在学习Docker, 于是就想把它融汇贯通, ...

  10. [转帖]MySQL的又一神器-锁,MySQL面试必备

    MySQL的又一神器-锁,MySQL面试必备 https://segmentfault.com/a/1190000020762791 lock 低一级的是 latch   原文链接:blog.ouya ...