题目链接: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. css3 svg 物体跟随路径动画教程

    css3 svg 物体跟随路径动画教程https://www.jianshu.com/p/992488f3f3fc

  2. day7-集合

    一.定义变量是为了吹处理状态的变化,定义变量名是为了获取变量值.字符串.数字.列表.元组.字典都是为了更好的描述变量的状态1.可变不可变:变量名不变时,里面内容是否可以变化# 可变:列表.字典.修改变 ...

  3. [ PyQt入门教程 ] PyQt5中数据表格控件QTableWidget使用方法

    如果你想让你开发的PyQt5工具展示的数据显得整齐.美观.好看,显得符合你的气质,可以考虑使用QTableWidget控件.之前一直使用的是textBrowser文本框控件,数据展示还是不太美观.其中 ...

  4. 微信小程序引入全局或公共样式

    在开发的过程中,总会遇到很多可复用性的样式,为了代码更加的简洁和减少微不住道的文件体积,我抽取了一部分的公共样式,并全局引入,不知是否妥当,如有更好的想法,欢迎一起探讨 在app.wxss中引入 然后 ...

  5. 2019年PHP面试题附答案(实战经验)

    出于一些原因近期做了一次工作变动,在职交接近一个半月时间大概面试了十五家公司,并且得到了自己比较满意的offer,最后基本上无缝衔接了新工作.总体来说,虽然准备的很充分,但面试期间还是暴露了许多问题, ...

  6. nyoj 773-开方数 (pow)

    773-开方数 内存限制:64MB 时间限制:1000ms 特判: No 通过数:3 提交数:8 难度:3 题目描述: 现在给你两个数 n 和 p ,让你求出 p 的开 n 次方. 输入描述: 每组数 ...

  7. gitbook怎么操作

    首先我先说一下什么是GitBook,它和Git没半毛钱关系,定义如下: GitBook 是一个基于 Node.js 的命令行工具,支持 Markdown 和 AsciiDoc 两种语法格式,可以输出 ...

  8. 在input输入值改变reducer里的值

    输入值改变reducer里的值 通过store.dispatch传入reducer中,函数的第二个参数可以接收到 在reducer中 在todolist文件中 然后在把this.state中的值改变

  9. tornado install

    pip install tornado Linux 安装时注意库的安装路径和执行时寻找路径是否一样 Windows 安装时注意user是否有权限 解决办法:

  10. no matches for kind "Deployment" in version "extensions/v1beta1"

    0x00 Problem [root@k8sm90 demo]# kubectl create -f tomcat-deployment.yaml error: unable to recognize ...