UVA 11987 Almost Union-Find (并查集,可持久化)

原创 2013年12月04日 12:29:44

大白书:p246 UVA 11987Almost Union-Find

加一个id[],不修改,而是insert,然后改id

const int MAXN = 100010 * 2;
const int MOD = 1000000;
 
int fa[MAXN], num[MAXN];
int sum[MAXN];
 
int idx[MAXN];
 
void init(int n)
{
   REP(i, n + 1)
    {
       idx[i] = i;
       fa[i] = i;
       num[i] = 1;
       sum[i] = i;
    }
}
 
int find(int x)
{
   if (x != fa[x])
       fa[x] = find(fa[x]);
   return fa[x];
}
 
int main()
{
   int n, m;
   int x, y;
   while (cin >> n >> m)
    {
       init(n);
       int k = n + 1;///!!!!!!
       while (m--)
       {
           RI(x);
           if (x == 1)
           {
                RII(x, y);
                int xx = idx[x];
                int yy = idx[y];
                int fax = find(xx);
                int fay = find(yy);
                if (fax != fay)
                {
                    fa[fax] = fay;
                    num[fay] += num[fax];
                    sum[fay] += sum[fax];
                }
           }
           else if (x == 2)
           {
                RII(x, y);
                int xx = idx[x];
                int yy = idx[y];
                int fax = find(xx);
                int fay = find(yy);
                if (fax != fay)
                {
                    num[fax]--;
                    sum[fax] -= x;
                    num[fay]++;
                    sum[fay] += x;
 
                    idx[x] = k;
                    num[k] = 1;
                    sum[k] = x;
                    fa[k] = fay;
                    k++;
                }
           }
           else
           {
                RI(x);
                int xx = idx[x];
                int fax = find(xx);
                printf("%d %d\n",num[fax], sum[fax]);
           }
       }
//       FE(i, 1, n)
//       {
//            int fax = find(idx[i]);
//            cout << i << "" << idx[i] << " " << fax << "" << num[fax] << " " << sum[fax] <<endl;
//       }
    }
}


可持久化并查集(三)——从动态到可持久化

其实在上一篇:可持久化并查集(二)——从镜像到动态中已经可以算是一个伪可持久化了,但是对于历史查询等操作无能为力。。所以本篇重点介绍可持久化操作 BZOJ 3673题目连接 这题不知道出题人什么...
  • lemonoil
  • lemonoil
  • 2017年02月26日 16:05
  • 3339

关于可持久化并查集的学习和思考

鉴于noip比赛前集训时SAKER前辈教了我这个蒟蒻可持久化线段树以来,我懂得了如何维护一个支持历史查询的线段树。于是我就开始异想天开了:可不可以快速维护一个支持历史查询的数组呢? 就在这时,我上网看...
  • KsCla
  • KsCla
  • 2016年12月12日 19:55
  • 2277

可持久性数组 bzoj3674 可持久化并查集加强版

传送门:点击打开链接 题意: 强制在线操作,定义3种操作,查询两个点是否在同一集合,合并两个点,把状态恢复到之前的某个状态 思路:利用线段树实现的可持久性数组,其实原理上就是线段树,那么是如何实现...
  • qwb492859377
  • qwb492859377
  • 2016年01月03日 19:38
  • 1651

uva11987 Almost Union-Find(可删除元素的并查集)

【题目大意】 给定n个集合:{1},{2},…,{n},要求支持三种操作: "1 p q":若p,q不在同一集合,将它们所在的集合合并成一个 "2 p q":若p,q不在同一集合,将元素p移动到q所在...
  • cjk_cjk
  • cjk_cjk
  • 2015年02月20日 23:28
  • 496

并查集间单个节点的转移(UVa 11987 Almost Union-Find)

从来没有这么艰难地完成一道算法题过!经过8次失败之后总算提交成功了!所以决定写一篇博文,对并查集的相关内容做一些总结。 普通并查集的操作无非是两种,find_set(x)即找到节点x所在的集合的代表...
  • u011915301
  • u011915301
  • 2014年12月24日 21:17
  • 613

UVa:11987 Almost Union-Find(并查集)

题意:要求你实现一个并查集,有以下3个功能:1,合并两个集合;2,将某个元素移动到另一个集合中;3,求某元素所在集合的元素个数与它们的和。 思路:对于普通并查集,只具备第1个功能。但是仔细研究一下功能...
  • kkkwjx
  • kkkwjx
  • 2014年03月22日 11:19
  • 550

UVA - 11987 - Almost Union-Find (又是并查集~)

UVA - 11987 Almost Union-Find Time Limit: 1000MS   Memory Limit: Unknown   64bit IO ...
  • u014355480
  • u014355480
  • 2015年02月12日 19:54
  • 697

UVA11987--Almost Union-Find--带权并查集

Description I hope you know the beautiful Union-Find structure. In this problem, you're to implem...
  • a305657
  • a305657
  • 2013年03月11日 20:12
  • 717

UVA 11987 Almost Union-Find(带有删除操作的并查集)

Problem A Almost Union-Find I hope you know the beautiful Union-Find structure. In this problem,...
  • u013742332
  • u013742332
  • 2014年03月30日 17:32
  • 324

UVa 11987 Almost Union-Find(带权并查集)

本题难点就是第二个操作。如果可以保证移动的节点一定是叶子节点,那就可以直接修改fa数组了。 为了实现这点,可以开2×n个节点,初始时i的父节点是i+n,这样在合并时可以保证前n个节点一定一直都是叶子...
  • Baoli1008
  • Baoli1008
  • 2015年03月20日 10:49
  • 299
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA 11987 Almost Union-Find (并查集,可持久化)
举报原因:
原因补充:

(最多只允许输入30个字)