//带删除操作的并查集
//题意:给你一个1~n的集合,有三种操作
// 1: 把p和q所在的集合合并
//2:把p移到q所在的集合中
//3:返回p所在集合中的元素个数和元素的和 //第二种操作不能直接把p的father改成q的father,因为这样p的子树也都换了爸爸
//对于每个元素,我们可以记录它所在的位置pos,合并的时候新申请一个pos,然后让这个元素的位置指向pos,再把pos和q合并
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; const int N=2e5+; int n,m;
int opt,p,q;
struct Node
{
Node *fa,*pos;
int key;
int cnt,sum;
}node[N]; typedef Node* Tree;
Tree now_node; int read()
{
char c=getchar();int num=,f=;
for(;!isdigit(c);c=getchar())
f=c=='-'?-:f;
for(;isdigit(c);c=getchar())
return num*+c-'';
return num;
} void init()
{
now_node=node;
for(int i=;i<=n;++i,++now_node)
{
now_node->key=i;
now_node->cnt=;
now_node->sum=i;
now_node->fa=now_node;
now_node->pos=now_node;
// (node+i)->cnt=(node+i)->sum=0;
// (node+i)->fa=(node+i);
// (node+i)->pos=(node+i);
}
//now_node=(node+n);
} Tree find(Tree x)
{
return x->fa==x?x:x->fa=find(x->fa);
} void unionn(Tree a,Tree b)
{
Tree fa=find(a),fb=find(b);
if(fa==fb)
return;
fa->fa=fb;
fb->cnt+=fa->cnt;
fb->sum+=fa->sum;
} void move(Tree a)
{
Tree fa=find(a->pos);
--fa->cnt;
fa->sum-=a->key;
++now_node;
now_node->key=a->key;
now_node->cnt=;
now_node->sum=a->key;
now_node->fa=now_node;
a->pos=now_node;
} int main()
{
while(scanf("%d%d",&n,&m)==)
{
init();
while(--m)
{
opt=read();
if(opt==)
{
p=read(),q=read();
unionn((node+p)->pos,(node+q)->pos);
}
else if(opt==)
{
p=read(),q=read();
Tree fa=find((node+p)->pos);
Tree fb=find((node+q)->pos);
if(fa!=fb)
{
move(node+p);
unionn((node+p)->pos,(node+)->pos);
}
}
else
{
p=read();
Tree fa=find((node+p)->pos);
printf("%d %d\n",fa->cnt,fa->sum);
}
}
}
return ;
}

最新文章

  1. Android百度地图 关于visibility=&quot;gone&quot;的奇葩问题
  2. activity跳转到新的activity后清除之前的activity
  3. Atitit.attilax重要案例&#160;项目与解决方案与成果 v6 qa15
  4. HTML 学习笔记 CSS样式(背景)
  5. 后台子线程(非主线程)更新UI引起的警告
  6. 《Java并发编程实战》读书笔记
  7. Android 学习笔记多媒体技术之 Drawable类+Tween(补间动画)+Frame(帧动画)
  8. JavaScript---Angular 和JQuery
  9. 17.1.1.2 Setting the Replication Slave Configuration
  10. 利用PartialView返回HTML模型视图
  11. Jenkins的安全控制
  12. Laravel 5.2 教程 - 数据填充
  13. 15分钟在阿里云Kubernetes服务上快速建立Jenkins X Platform并运用GitOps管理应用发布
  14. #2019-2020-4 《Java 程序设计》第七周总结
  15. BZOJ3172 [Tjoi2013]单词 字符串 SA ST表
  16. android post 方式 访问网络 实例
  17. 字典取KEY,占位符,延迟刷新
  18. Django之Web框架本质及第一个Django实例
  19. Web of Science API
  20. [Win32]一个调试器的实现(五)调试符号

热门文章

  1. Jupyter Notebook的配置(密码端口+远程登陆+nbextension)
  2. 阿里云ECS服务器将默认的Ubuntu系统改成桌面版
  3. java mybatis
  4. Java调用WebService方法总结(1)--准备工作
  5. top 命令 详解
  6. element-ui日期筛选:选择日期即触发查询
  7. 使用ngspice进行电路仿真
  8. PostgreSQL SERIAL创建自增列
  9. 经典数据结构与算法在经典软件(linux kernel)中的应用
  10. 微信支付接口--支付成功的回调--超详细Demo