题目链接: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. docker——harbor

    为什么要用harbor? 在实际生产运维中,往往需要把镜像发布到几十.上百台或更多的节点上.这时单台Docker主机上镜像已无法满足,项目越来越多,镜像就越来越多,都放到一台Docker主机上是不行的 ...

  2. 重写(OverRide)/重载(Overload)

    方法的重写规则 参数列表必须完全与被重写方法的相同: 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同): ...

  3. vue2获取dom节点

    vue2.*版本中 在标签中加上ref='dom',然后在代码中this.$refs.dom这样就拿到了页面元素 例如:<div class='box' ref='myBox'>你好< ...

  4. XML解析之Jsoup

    操作xml文件 解析(读取):将文档中的数据解读到内存中 写入:将内存中的数据保存到XML文档中.持久化的存储 解析xml的方式 DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树 优点 ...

  5. 【algo&ds】3.栈和队列

    1.堆栈 堆栈(Stack):具有一定操作约束的线性表(只在一端(栈顶,Top)做插入.删除) 先进后出特性 1.1堆栈的抽象数据类型描述 类型名称: 堆栈(Stack) 数据对象集:一个有0个或多个 ...

  6. secureCRT安装与激活

    SecureCRT安装及激活方式 百度网盘地址: SecureCRT及激活软件的地址: 1. 安装secureCRT 百度网盘下载,点击scrt814-x64.exe,按照提示安装secureCRT, ...

  7. vue在移动端实现复制数值到剪贴版

    实现按键就指定内容复制到设备的剪贴版,这里是复制快递单号 html <div slot="footer" v-if="express.number" st ...

  8. vux组件的全局注册引入

    安装好vux后,要引入全局组件是要在main.js中使用Vue.component引入的,不能直接使用Vue.use,不能直接使用Vue.use,不能直接使用Vue.use import router ...

  9. firefox浏览器中使用vux的x-input报错TypeError: _this3.$refs.input.scrollIntoViewIfNeeded is not a function

    最近做公众号项目,想着统一风格,所以决定使用vux. 在调试时发现,只要鼠标点击x-input输入框,就会报错 TypeError: _this3.$refs.input.scrollIntoView ...

  10. vue 学习 渲染、v-指令

    vue渲染 在组件中data是一个方法里面的值要是一个对象return出去 export default { name: "HelloWorld", data() { return ...