点赞(0)
 

0.0分

33 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 16 条评论

manstain 1年前 回复TA
逆天
Passerby 2年前 回复TA
如果使用unordered_map来替代数组来实现并查集的话,速度反而慢了。
#include <bits/stdc++.h>
using namespace std;
unordered_map<int,int> mp;
int find(int x){
	if(mp.count(x)) mp[x]=find(mp[x]);
	else{
		mp[x]=x+1;
		return x;
	}
	return mp[x];
}
int main(){
	int n;
	cin>>n;
	vector<int> arr(n);
	for(int i=0;i<n;i++){
		cin>>arr[i];
	}
	for(int i=0;i<n;i++){
		if(!mp.count(arr[i])) mp[arr[i]]=arr[i]+1;
		else{
			arr[i]=find(arr[i]);
		}
	}
	for(int i=0;i<arr.size();i++) cout<<arr[i]<<" ";
	return 0;
}
阿状 2年前 回复TA
@wsnd 我也是
3年前 回复TA
@陈锦强cjq 这个是在别的网站的,他在后台自动加上 C 语言的标准输入输出了。如果出错也可以自己加上哈
3年前 回复TA
@学而进 哈哈,推荐 Acwing 啊
11.2km/s 3年前 回复TA
@我叫不紧张 最后栈溢出
11.2km/s 3年前 回复TA
@我叫不紧张 宁这个不是死循环了,一直执行find(x)没有返回
我叫不紧张 3年前 回复TA
@我叫不紧张 懂了,不愧为大佬,两行代码就实现了这么多的功能。
我叫不紧张 3年前 回复TA
查找祖宗结点函数部分,为什么换成其他的书写方式就运行超时了呢?为什么这样的书写方式直接默认了路径压缩呢?(其他的都需要额外写一部分路径压缩的代码)
比如,改成如下这种形式就会提示超时,这又跟您的代码有什么区别呢?
int find(int x )
{
    while(x!=find(x))
    {
        x=find(x);
    }
    return x;
}
陈锦强cjq 3年前 回复TA
为什么它包含iostream头文件还可以用scanf()和printf()