并查集 2019年8月10日计蒜客联盟周赛 K.数组
题目链接:https://nanti.jisuanke.com/t/40860
题意:给一个长度为n的数组a[],n<1e5,a[i]<1e5
三个操作:
1 x y:把所有值为x的数据改成a[y]
2 x:输出a[x]的值
3 x:值为x的树有多少个
官方解析:
设father[i]表示初值为i的元素,当前的值为多少。
设cnt[i]表示当前值为i的元素有多少。
用并查集维护这两个数组。
个人思路:
做这道题的人并不多,可能是想不到可以用并查集(那我+1)。
因为要将值为x的数据进行修改,所以fa[i]!=a[i],而是存的i,即fa[i]=i(i从1到maxn)。
1操作把x和a[y]进行merge(merge中把x的size加给a[y],x的size置为0,变成有size[x]+size[a[y]]个a[y],0个x)。
但是如果size[x]已经是0了(有0个值为x的数,已经变成某个数tmp了),就不能把他和a[y]合并了,不然2操作查询a[x]就会输出是a[y]而不是tmp。【感谢starhai霸霸的指出】
2操作输出a[x]的祖宗结点,3操作输出size[x]。
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int n,a[maxn];
int size[maxn],fa[maxn];
int get(int x)
{
if(fa[x]==x){return x;}
int y=fa[x];
fa[x]=get(y);
return fa[x];
} void merge(int a,int b)
{
a=get(a);
b=get(b);
if(a!=b)
{
fa[a]=b;
size[b]+=size[a];
size[a]=;
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
fa[a[i]]=a[i];
size[a[i]]++;
}
int q;
scanf("%d",&q);
while(q--)
{
int op,x,y;
scanf("%d",&op);
if(op==)
{
scanf("%d%d",&x,&y);
if(size[x]) merge(x,a[y]);
}
else if(op==)
{
scanf("%d",&x);
printf("%d\n",get(a[x]));
}
else
{
scanf("%d",&x);
printf("%d\n",size[x]);
}
}
return ;
}
自用带权并查集模板
#include <iostream>
using namespace std;
int father[],n;
int dist[],size[];
void init()
{
for(int i=;i<=n;i++)
{
father[i]=i,dist[i]=,size[i]=;
}
}
int get(int x){
if(father[x]==x){return x;}
int y=father[x];
father[x]=get(y);
dist[x]+=dist[y];
return father[x];
}
void merge(int a,int b)
{
a=get(a);
b=get(b);
if(a!=b)
{
father[a]=b;
dist[a]=size[b];
size[b]+=size[a];
}
} int main() {
n=;init(); //每个节点刚开始的祖宗都是自己
merge(,); //1的根节点指向2的根节点,father[1的祖宗]=2的祖宗
merge(,);
merge(,);
merge(,);
get(); //找出1的祖宗
cout<<dist[]+<<endl; //size是包括自己的子孙个数,dist为元素到队首的距离
get();
cout<<dist[]+<<endl;
return ;
}
dist跟merge的顺序有关
并查集 2019年8月10日计蒜客联盟周赛 K.数组的更多相关文章
- 线段树+lazy标记 2019年8月10日计蒜客联盟周赛 C.小A的题
题目链接:https://nanti.jisuanke.com/t/40852 题意:给定一个01串s,进行m次操作,|s|<=1e6,m<=5e5 操作有两种 l r 0,区间[l,r] ...
- 易初大数据 2019年11月10日 spss习题 王庆超
◆1.一个数据文件包含下列数据,5个家庭没有汽车(编码为0),20个家庭有一辆汽车(编码唯1),10个家庭拥有两辆汽车(编码为2)指出下列哪种统计量适用于描述该数据并计算出统计量的值.A A拥有汽车数 ...
- 2019年3月10日 装饰器进阶-模拟session
ser_dic={'username':None,'login':False}#用户字典,反应登入状态,用字典做全局变量 def idf(func):#验证登入信息是否正确 def wrapper(* ...
- 【2019年04月10日】股票的滚动市盈率PE最低排名
仅根据最新的市盈率计算公式进行排名,无法对未来的业绩做出预测. 新钢股份(SH600782) - 滚动市盈率PE:3.87 - 滚动市净率PB:1.29 - 滚动年化股息收益率:1.31% - 钢铁 ...
- Ubantu创建热点并共享——2019年5月10日更新
只需要两步,参考以下两篇文章: ubuntu16.04上安装配置DHCP服务的详细过程 Ubuntu18.04 创建与编辑热点的方法
- 【蜕变之路】第20天 UUID和时间戳的生成 (2019年3月10日)
Hello,大家好!我是程序员阿飞!今天主要学习的内容是:字符串UUID的随机生成和时间戳的随机生成.好了,直接进入正题. 1.UUID的随机生成 /* * uuid的随机生成方式 ...
- 35.ES6语法介绍——2019年12月24日
2019年12月24日16:22:24 2019年10月09日12:04:44 1. ES6介绍 1.1 新的 Javascript 语法标准 --2015年6月正式发布 --使用babel语法转换器 ...
- [网站公告]3月10日23:00-4:00阿里云SLB升级,会有4-8次连接闪断
大家好,阿里云将于3月10日23:00-4:00对负载均衡服务(SLB)做升级操作,升级期间SLB网络连接会有约4-8次闪断.由此给您带来麻烦,敬请谅解! 阿里云SLB升级公告内容如下: 尊敬的用户: ...
- 2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥?
2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥? 转 https://www.ithome.com/html/android/372234.htm 据泰尔终端实验室公众微信 ...
随机推荐
- 如何提高web应用的吞吐量
这篇博文所列举的优化手段是针对比较传统项目,但是想提高系统的吞吐量现在时髦的技术还是那些前后端未分离, 使用nginx当成静态资源服务器去代理我们的静态资源 是谁限制了Throughput? 当我们对 ...
- 在小程序中使用md5
使用md5.js的首先你要有md5.js这个文件https://github.com/emn178/js-md5 您也可以使用Bower安装js-md5. bower install md5 对于no ...
- Spring boot 加入shiro支持
在项目添加依赖 <!-- shiro spring. --> <dependency> <groupId>org.apache.shiro</groupId& ...
- 力扣(LeetCode)删除排序链表中的重复元素 个人题解
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 这题思路比较简单,同样是快慢针的思路. 用一个整数类型val对应最新的只出现过一次的那个值, 如果节点的下一个节点的值和这个对应则不做别 ...
- Linux系统时间\硬件时间(date、tzselect、clock、hwclock、ntpdate)
1.系统时间和硬件时间 在Linux中有硬件时钟与系统时钟两种时钟.硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟.系统时钟则是指kernel中的时钟.所有Linux相关指令与函 ...
- opencv 4 图像处理(漫水填充,图像金字塔与图片尺寸缩放,阈(yu)值化)
漫水填充 实现漫水填充算法:floodFill函数 简单调用范例 #include <opencv2/opencv.hpp> #include <opencv2/imgproc/im ...
- vim常用命令集合(精心整理)
vim编辑器身为一个强大的linux平台编辑器,我就不多说他强大之处了,直接来简述下常用命令,提高自己使用编辑器的效率. 然后就先说下vim编辑器的模式,有的地方说三种,有的地方说两种,教程是按照两种 ...
- 查看k8s中etcd数据
#查看etcd pod kubectl get pod -n kube-system | grep etcd #进入etcd pod kubectl exec -it -n kube-system e ...
- 如何通过swoole加速laravel的问题?
这篇文章主要介绍了关于如何使用swoole加速laravel,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 再来复习一下吧,导致 php 慢的各种因素中解析性语言的特性可以说是罪魁祸首 ...
- mysql安装与sqlyog安装
首先是mysql安装,参考下面两个链接 https://www.cnblogs.com/gengyufei/p/11735358.html#_label4 https://www.jb51.net/a ...