题目链接: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.数组的更多相关文章

  1. 线段树+lazy标记 2019年8月10日计蒜客联盟周赛 C.小A的题

    题目链接:https://nanti.jisuanke.com/t/40852 题意:给定一个01串s,进行m次操作,|s|<=1e6,m<=5e5 操作有两种 l r 0,区间[l,r] ...

  2. 易初大数据 2019年11月10日 spss习题 王庆超

    ◆1.一个数据文件包含下列数据,5个家庭没有汽车(编码为0),20个家庭有一辆汽车(编码唯1),10个家庭拥有两辆汽车(编码为2)指出下列哪种统计量适用于描述该数据并计算出统计量的值.A A拥有汽车数 ...

  3. 2019年3月10日 装饰器进阶-模拟session

    ser_dic={'username':None,'login':False}#用户字典,反应登入状态,用字典做全局变量 def idf(func):#验证登入信息是否正确 def wrapper(* ...

  4. 【2019年04月10日】股票的滚动市盈率PE最低排名

    仅根据最新的市盈率计算公式进行排名,无法对未来的业绩做出预测. 新钢股份(SH600782) - 滚动市盈率PE:3.87 - 滚动市净率PB:1.29 - 滚动年化股息收益率:1.31% - 钢铁 ...

  5. Ubantu创建热点并共享——2019年5月10日更新

    只需要两步,参考以下两篇文章: ubuntu16.04上安装配置DHCP服务的详细过程 Ubuntu18.04 创建与编辑热点的方法

  6. 【蜕变之路】第20天 UUID和时间戳的生成 (2019年3月10日)

    Hello,大家好!我是程序员阿飞!今天主要学习的内容是:字符串UUID的随机生成和时间戳的随机生成.好了,直接进入正题. 1.UUID的随机生成 /*          * uuid的随机生成方式 ...

  7. 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语法转换器 ...

  8. [网站公告]3月10日23:00-4:00阿里云SLB升级,会有4-8次连接闪断

    大家好,阿里云将于3月10日23:00-4:00对负载均衡服务(SLB)做升级操作,升级期间SLB网络连接会有约4-8次闪断.由此给您带来麻烦,敬请谅解! 阿里云SLB升级公告内容如下: 尊敬的用户: ...

  9. 2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥?

    2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥? 转 https://www.ithome.com/html/android/372234.htm   据泰尔终端实验室公众微信 ...

随机推荐

  1. 深入理解java继承从“我爸是李刚”讲起

    目录 1.继承的概述 2.关于继承之后的成员变量 3.关于继承之后的成员方法 4.关于继承之后的构造方法 5.关于继承的多态性支持的例子 6.super与this的用法 前言 本文主要多方面讲解jav ...

  2. 在控制器中如何对frxml的控件初始化

    如果在控制器中实现Initializable这个接口,并重iInitializable这个方法 对于一个fxml文件来说它首先执行控制器的构造函数,这个时候它是无法对@FXML修饰的方法进行访问的,然 ...

  3. kubespray2.11安装kubernetes1.15

    关于kubespray Kubespray是开源的kubernetes部署工具,整合了ansible,可以方便的部署高可用集群环境,官网地址:https://github.com/kubernetes ...

  4. Electron 菜单切换主题与css替换 ts编写

    ////目标css<link rel="stylesheet" id="theme_css" href="路径"> ////ts ...

  5. 替换"marquee",实现无缝滚动

    js的marquee标签,可以实现元素循环滚动,但是不能无缝连接,要实现“无缝滚动”的效果必须使用js(借鉴百度),思路是使要滚动元素相对位置不断改变,上下滚动就相对top或者bottom,左右滚动就 ...

  6. suseoj 1206 众数问题 (相邻数比较)

    1206: 众数问题 时间限制: 1 Sec  内存限制: 128 MB提交: 45  解决: 8[提交][状态][讨论版][命题人:liyuansong] 题目描述 给定含有n个元素的多重集合S,每 ...

  7. 关于GC(中):Java垃圾回收相关基础知识

    Java内存模型 (图源: 深入理解JVM-内存模型(jmm)和GC) 区域名 英文名 访问权限 作用 备注 程序计数器 Program Counter Register 线程隔离 标记待取的下一条执 ...

  8. mysql清空数据库下所有的表

    一.使用以下命名获取truancate  数据库 lz_garden 下所有表,并将其导入到 d盘 为 out.sql select Concat('TRUNCATE TABLE ', TABLE_N ...

  9. 2016 校招, Android 开发,一个本科应届的坎坷求职之路(转)

    转载出处:http://www.nowcoder.com/discuss/3244?type=2&order=0&pos=1&page=1 和大多数的面经不同,我不是大牛,手头 ...

  10. 微信公众号配置及微信jsAPI支付

    公众号配置 一.基本配置 首先登陆微信公众平台,在开发--->配置--->公众号开发信息,获取到AppId,开发者秘钥是后台需要的,给到后台,IP白名单配置就是你服务器的IP地址写到里面就 ...