//带删除操作的并查集
//题意:给你一个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 ;
}

H - Almost Union-Find的更多相关文章

  1. 大小端; union

    #include<stdio.h> #include <stdlib.h> typedef union { int m; char a[4]; }Node; int main ...

  2. C语言中的union

    1.union中可以定义多个成员,union的大小由最大的成员的大小决定. 2.union成员共享同一块大小的内存,一次只能使用其中的一个成员,与struct形成鲜明对比. 3.对某一个成员赋值,会覆 ...

  3. (转)C语言union(联合体 共用体)

    一直以来,union都是个很少用到的东西,对于这些不常用的结构往往记不住.这次看书又看到了,还是学习一下吧.一般在Windows API的一些数据结构中才能看到这个union,其实并不复杂.本质上来说 ...

  4. c语言:union,大小端

    union: 不允许只用联合变量名作赋值或其它操作. 也不允许对联合变量作初始化赋值,赋值只能在程序中进行. 小端存储: 以字节为单位,低存低,高存高. 任何数据在内存中都是以二进制(1或着0)顺序存 ...

  5. 关于 typedef & typedef struct & typedef union理解 --写给不长脑子的我

    来源: http://zhidao.baidu.com/link?url=qxzkx5gaoCfnHnygYdzaLEWkC45JqNYYUk42eHHjB0yB3ZMgHv6lGjnq3CRfgQw ...

  6. C语言中Union类型的使用方法

    转自:http://blog.csdn.net/feimor/article/details/6858103 使用C语言时,常常使用struct,对于union类型却几乎没有用过,只知道它是联合类型, ...

  7. C语言中的union使用方法

    union共用声明和共用一变量定义: "联合"是一种特殊的类,也是一种构造类型的数据结构.在一个"联合"内能够定义多种不同的数据类型. 一个被说明为该" ...

  8. PHP源码分析-变量

    1. 变量的三要素变量名称,变量类型,变量值 那么在PHP用户态下变量类型都有哪些,如下: // Zend/zend.h #define IS_NULL 0 #define IS_LONG 1 #de ...

  9. 自制编程语言crowbar(v0.1)构建解析器时分配内存

    crowbar中第一次申请内存是在生成解析器的时候: /* interface.c */CRB_Interpreter *CRB_create_interpreter(void) { MEM_Stor ...

  10. python整理之(字符串、元组、列表、字典)

    一.关于字符串的整理总结 对于字符串的操作常用的有这些: 字符串的操作通过dir()函数可以查看 我们先整理没有下划线的用法,有下划线的暂时不去考虑. 1.capitalize 功能:使字符串的首字母 ...

随机推荐

  1. 递归在JavaScript中的应用实例

    递归 适用的必要条件:①过程的描述中包含它自身②有明确的结束递归的条件. 主要思路:在每一次调用自己时,使用相同的解决问题的方法,但调用的参数每次不同(有规律的变化),使用一个终止处理(结束递归)的条 ...

  2. ubuntu18.04使用vscode报pylint is not install错误

    1.安装pip:sudo apt-get install pip,如果使用python3则需要安装pip3:sudo apt-get install python3-pip 2.使用pip安装pyli ...

  3. MySQL数据库使用时注意事项

    MySQL数据库使用时注意事项 建表的角度上 1.合理安排表关系 2.尽量把固定长度的字段放在前面 3.尽量使用char 代替varchar 4.分表:水平分和垂直分 在使用sql语句的时候 1.尽量 ...

  4. SIM7000C TCP

    SIM7000C是基于高通MDM9206平台开发LTE CAT M1(eMTC) 和NB-IoT模块,能支持LTETDD/LTE-FDD/GSM/GPRS/EDGE多个频段,上下行数据流量峰值达到37 ...

  5. iOS配置TARGETS

    说一下背景 自从这个项目不死不活的迭代了2年,从项目搭建到现在,一直都是自己在开发和维护,所以项目结构非常清晰,但是之前的水平写的代码现在看来也是惨不忍睹,不过本人比较懒,也就没有考虑过重构的事情 - ...

  6. c#指定长度切割字符串,返回数组

    public List<string> subStringByCount(string text, int count) { ;//开始索引 ;//结束索引 double count_va ...

  7. python图片二值化提高识别率

    import cv2from PIL import Imagefrom pytesseract import pytesseractfrom PIL import ImageEnhanceimport ...

  8. Python 源码剖析 目录

    Python 源码剖析 作者: 陈儒 阅读者:春生 版本:python2.5 版本 本博客园的博客记录我会适当改成Python3版本 阅读 Python 源码剖析 对读者知识储备 1.C语言基础知识, ...

  9. spring的Autowired、Resource、Inject的使用

    基本知识:spring最底层使用的是Map,id是bean的id,value是bean的class或者是实例. 1:bean的加载顺序. @Bean("testDao") publ ...

  10. Python基础Day1—下

    六.Python运行 print()   打印命令,输出到屏幕上 操作: 命令提示符-->输入Python-->文件路径 若输入Python回车报错或者提示没有,则Python解释器没有安 ...