//带删除操作的并查集
//题意:给你一个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. Deep one-class classification

    Deep one-class classification 2019-03-17 23:09:59 zpainter 阅读数 1027  收藏 文章标签: 单分类问题异常检测 更多 分类专栏: 论文 ...

  2. js 页面技巧

    需要获取页面上固定的某个按钮的属性值.我们需要在页面加载完的第一刻将值存储到定义的变量,防止用户更改页面样式读不出当前元素.如果页面刷新会重置当前属性 <body> <input v ...

  3. PCL提取圆柱系数

    网上看了很多教程,没看到圆柱提取后的系数解释. 源码如下: #include <pcl/ModelCoefficients.h> #include <pcl/io/pcd_io.h& ...

  4. SQL注入绕过技巧

    1.绕过空格(注释符/* */,%a0): 两个空格代替一个空格,用Tab代替空格,%a0=空格: % % %0a %0b %0c %0d %a0 %00 /**/ /*!*/ 最基本的绕过方法,用注 ...

  5. MFC_选择目录对话框_选择文件对话框_指定目录遍历文件

    选择目录对话框 void C资源共享吧视频广告清理工具Dlg::OnBnClickedCls() { // 清空编辑框内容 m_Edit.SetWindowTextW(L""); ...

  6. shell 字符串截取表达式

    ${var#str} 从左向右匹配,非贪婪匹配,截取并保留右边的内容 txt='123456abc123456' echo ${txt#*34} # 56abc123456 ${var##str} 从 ...

  7. 用weexplus从0到1写一个app(2)-页面跳转和文章列表及文章详情的编写

    说明 结束连续几天的加班,最近的项目终于告一段落,今天抽点时间开始继续写我这篇拖了很久的<用weexplus从0到1写一个app>系列文章.写这篇文章的时候,weexplus的作者已经把w ...

  8. Java网上学习资料

    1.今天查找关于代理模式时找到的两个网站:take control with proxy design pattern

  9. 0001-代码仓库-git 命令

    参考 https://www.cnblogs.com/NTWang/p/6213408.html https://www.cnblogs.com/Sungeek/p/6905102.html

  10. 【JUC】7.CountDownLatch

    Latch:门闩.一种线程通信的方式:当程序不涉及同步,仅仅需要线程通信的时候,使用synchronize或者lock的线程通信等待唤醒机制,就显得太重了: 这时候,可以考虑使用信号量类:CountD ...