当前位置: 首页 > news >正文

【并查集】[ABC372E] K-th Largest Connected Components 题解

题意

前置阅读:并查集算法介绍

洛谷链接

Atcoder 链接

给定 n ( 1 ≤ n ≤ 2 × 1 0 5 ) n(1 \leq n \leq 2\times 10^5) n(1n2×105) 个点,初始没有边,您要进行以下操作:

1 a b,表示连接一条 ( a , b ) (a,b) (a,b) 无向边,保证 1 ≤ a < b ≤ n 1 \leq a < b \leq n 1a<bn

2 a b,表示查询在 a a a 这个联通块中,它能去到的点的编号的第 b b b 大的点为几号(可以去到的点包括这个点本身)。若无,输出 -1。保证 1 ≤ a ≤ n , 1 ≤ b ≤ 10 1 \leq a \leq n,1 \leq b \leq 10 1an,1b10

思路

考虑操作 2 中 b b b取值较小,用预处理的方式,记 c o n n e c t i , j connect_{i,j} connecti,j 表示在 i i i 这个联通块中第 j j j大的编号,维护合并即可。代码中 count 无法正常运行,用 define 替换即可。

代码

#include<bits/stdc++.h>
#define count coount
#define int long long
using namespace std;
int q,head[200005],n;
int connect[200005][21];
int count[200005];
int find(int x) {return head[x] == x?x:head[x] = find(head[x]);
} 
int a[25];
bool cmp(int x,int y) {return x > y;
}
void hebing(int x,int y) {int cnt = 1;for(;cnt <= count[x];cnt++) {a[cnt] = connect[x][cnt];}for(;cnt <= count[x] + count[y];cnt++) a[cnt] = connect[y][cnt - count[x]];cnt--;//printf("________%lld %lld %lld\n",count[x],count[y],cnt);sort(a + 1,a + cnt + 1,cmp);for(int i = 1;i <= 10 and i <= cnt;i++) connect[x][i] = a[i];return;
}
signed main() {scanf("%lld %lld",&n,&q);for(int i = 1;i <= n;i++) count[i] = 1,connect[i][1] = i,head[i] = i;while(q--) {int a,b,c;scanf("%lld %lld %lld",&a,&b,&c);if(a == 1) {b = find(b),c = find(c);if(b != c) {hebing(b,c);count[b] += count[c];if(count[b] > 10) count[b] = 10;head[c] = b;}}else {if(count[find(b)] < c) printf("-1\n");else printf("%lld\n",connect[find(b)][c]);}}return 0;
}
http://www.lryc.cn/news/446945.html

相关文章:

  • HarmonyOS面试题(持续更新中)
  • QT中QWidget和QObject的区别与联系是什么
  • 解决macOS安装redis以后不支持远程链接的问题
  • 2024年研究生数学建模“华为杯”E题——肘部法则、k-means聚类、目标检测(python)、ARIMA、逻辑回归、混淆矩阵(附:目标检测代码)
  • 绝了,自从用了它,我每天能多摸鱼2小时!
  • C语言指针系列1——初识指针
  • 传神论文中心|第26期人工智能领域论文推荐
  • NLP基础1
  • 001.docker30分钟速通版
  • Kafka 在 Linux 下的集群配置和安装
  • Python--操作列表
  • JMeter(需要补充请在留言区发给我,谢谢)
  • 线程池的执行流程和配置参数总结
  • node-red-L3-重启指定端口的 node-red
  • (done) 使用泰勒展开证明欧拉公式
  • 红队apt--邮件钓鱼
  • 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)
  • DNS协议解析
  • 每日一题——第一百零八题
  • 使用Python免费将pdf转为docx
  • 树莓派4B+UBUNTU20.04+静态ip+ssh配置
  • C#实现指南:将文件夹与exe合并为一个exe
  • linux信号 | 学习信号三步走 | 全解析信号的产生方式
  • C++ 刷题 使用到的一些有用的容器和函数
  • 【Kubernetes】常见面试题汇总(三十四)
  • C++标准库双向链表 list 中的insert函数实现。
  • 华为机考练习(golang)
  • 51单片机快速入门之按键应用拓展
  • 数据库 - MySQL的事务
  • 【Python机器学习】NLP信息提取——提取人物/事物关系