目录

前置知识

题目描述

样例与数据范围

解题思路

AC 代码


前置知识:

        并查集 (路径压缩),快速排序(sort),结构体

题目描述:

样例与数据范围:

解题思路:

在并查集的专题里,当然是用并查集啦!

刚开始的时候,小编还以为是用搜索的 qwq (你看这个题,他多像搜索啊),再读一读题目,n 个点,m 条边,这很明显是个图论题啊(废话,并查集不就是图论的一部分吗),再想一想,利用并查集维护图的连通性,建立一个 sum 数组维护集合大小,就可以完美解决了。

为了使用时方便,可以先将原数据按照人气值 d 从小到大排个序。

不难发现(是真的不难),排序后在前面的询问能经过的边在后面的边一定能经过。所以我们可以按顺序连边(所以,要将 q 组询问的数据按照 x 从小到大的顺序排个序),对于每一个询问加入能够加入的边,利用并查集维护图的连通性,用 sum 数组维护集合大小。对于加入的一条边 ,若 a , b 在同一集合中,则可以直接忽略;否则对答案的贡献为 sum[a] * sum[b]。

因为是双向通道,二并查集的统计方式之后统计一次(也就是说(a , b) 和 (b , a) 两种法案,只会统计一次,所以不要忘记将答案乘2。

因为将询问数据排序后可能会让输出的顺序变乱,所以要建立一个 ans 数组来存储每次询问的答案

AC 代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<cstring>
#include<queue>//头文件不解释
using namespace std;
int test,Q,n,m,tot;//test是数据的组数,Q是每组数据中的询问次数,n是景点数,m是边数
int fa[100001];//记录其祖先元素
int sum[100001];//用于维护集合的大小
int ans[100001];//储存每次询问的答案
struct no//记录原始数据
{int x;//出发景点int y;//到达景点int d;//人气值
}a[100001];
struct de//记录询问的数据
{int x;//记录要求不能超过的人气值的大小int num;//记录第几次询问
}q[100001];
bool cmp1(no a,no b)//将原始数据按从小到大的顺序排个序
{return a.d<b.d;
}
bool cmp2(de a,de b)//将询问数据也按从小到大的顺序排个序
{return a.x<b.x;
}
int find(int x)//并查集基本操作,寻找该节点的祖先
{if(!fa[x]) {return x;}return fa[x]=find(fa[x]);
}
void add(int x,int y)//并查集基本操作,合并两个集合,不过要穿差一点东西,以到达维护sum数组的目的
{int u=find(x);//寻找x祖先元素int v=find(y);//寻找y祖先元素if(u==v)//如果两个元素已在同一个集合,则直接忽略{return;}tot+=sum[u]*sum[v]*2;//否则,这两个点对答案的贡献就是sum[u]*sum[v]*2(不要忘记乘2)fa[u]=v;//合并两个集合sum[v]+=sum[u];//维护sum数组sum[u]=0;//这里写不写都可以(只要你对并查集理解得够深,就能明白)
}
int main()
{scanf("%d",&test);//输入testwhile(test--)//test次循环{scanf("%d%d%d",&n,&m,&Q);//读入for(int i=1;i<=m;i++)//读入{scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].d);}sort(a+1,a+m+1,cmp1);//给原始数据排序for(int i=1;i<=Q;i++)//读入{scanf("%d",&q[i].x);//读入q[i].num=i;//记录一下是第几次询问}sort(q+1,q+1+Q,cmp2);//给询问数据排序tot=0;//记录景点的对数for(int i=1;i<=n;i++)//并查集基本操作之一————初始化{fa[i]=0;sum[i]=1;//初始时每个元素都是一个集合,所以sum数组的值都为1}             int j=1;//记录当前询问到第几组道路for(int i=1;i<=Q;i++){while((j<=m)&&(a[j].d<=q[i].x)){add(a[j].x,a[j].y);//合并两个集合j++;//询问数加1}ans[q[i].num]=tot;//记录答案}for(int i=1;i<=Q;i++)//输出{printf("%d\n",ans[i]);}}return 0;//完结撒花
}

YbtOJ 躲避拥挤(并查集)相关推荐

  1. ybtoj 躲避拥挤 并查集

    题目 样例 数据范围 解题 乍一看是图,但是并查集.其实画个图就知道了 用微软白板画的,鼠标作画. 可以看到3和5之间是5705的人气值,当询问6000时,就会有 (5,3)和(3,5)这两个组合满足 ...

  2. 【ybtoj 高效进阶 3.1】 【并查集】 逐个击破

    [ybtoj 高效进阶 3.1] [并查集] 逐个击破 题目 解题思路 换一个思路 求出保留的边 用总边权减去保留的 能被保留下来的边的两个端点不能都被k军团占领 我们要做的就是维护每个连通块 有被占 ...

  3. 【算法】并查集刷题总结

    目录 P1396 营救 题目描述 "咚咚咚--""查水表!"原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门-- 妈妈下班回家, ...

  4. 并查集——营救(洛谷 P1396)

    题目选自洛谷P1396 看到最大的最小很多人想到二分,但是可以有更好的解法. 我们不妨用并查集维护这个图,将边从小到大排序,每次取出边权最小的边,若该边的起点与终点未在一个集合内,就将其合并.当源点与 ...

  5. 洛谷[P1396]营救 并查集

    题目地址http://www.luogu.org/problem/show?pid=1396 P1396拯救膜法师(欸??) 题目描述 "咚咚咚--""查水表!" ...

  6. 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈

    题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...

  7. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  8. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法

    tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...

  9. POJ - 2513 Colored Sticks 欧拉通路+并查集+静态树

    一开始想用map来搞,但是感觉好复杂,然后想了一下看大佬们用trie做的,感觉十分合理就敲了一发. 一开始re,数组要开到550000 只会静态的字典树,在每个根节点看是否出现过改颜色,如果没有就把该 ...

最新文章

  1. C++中前置声明介绍
  2. Python_note7 文件和数据格式化+wordcloud库
  3. 机器学习中的双层规划问题
  4. 最小生成树的Kruskal算法实现
  5. 从“小白”到“白帽子黑客”的实用指南
  6. 2017.10.17 蜘蛛难题 思考记录
  7. sql server 监视_如何在SQL Server中监视对象空间增长
  8. 为什么语音输入法始终没有在电脑上得以普及?
  9. 时间字段加一秒_面试Java后端却问我时间轮(Time Wheel)算法,面试官没想到我看过Dubbo源码!...
  10. 模型选择 + 过拟合和欠拟合 动手学深度学习v2 pytorch
  11. linux中类似append的命令,Linux技巧:介绍 tar 命令打包、压缩、和加解密的用法
  12. Win7 下替代NetMeeting的屏幕共享工具 InletexEMC
  13. 《普林斯顿微积分读本》笔记
  14. linux ospf 命令,Linux_防火墙入门22:常用路由协议(OSPF)配置实例
  15. 一文简单了解粒子群算法(PSO)
  16. linux渲染农场大连教程,Deadline渲染农场搭建
  17. 常用智能小车电机驱动模块选型
  18. 2021-02-15 大数据课程笔记 day26
  19. 内网穿透工具(永久免费、永不限速、开源)、一键启动、页面操作(支持window,mac),自定义二级域名
  20. 2019-8-24 小米商城商品展示界面

热门文章

  1. springboot集成mybatis原理剖析
  2. CAD多张图转化为PDF
  3. Ubuntu中添加五笔
  4. 书论39 欧阳修《笔说》
  5. grid 栅格/网格布局学习笔记
  6. highcharts 怎么画网格
  7. 《从零开始的旅拍vlog指南》一步步成为vlog达人
  8. Uni-appVue完成小程序DIY装修方案经验分享
  9. 中国有机啤酒市场趋势报告、技术动态创新及市场预测
  10. 不体贴的父亲(李文斯登·劳奈德)