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;
//       }
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

本题难点就是第二个操作。如果可以保证移动的节点一定是叶子节点,那就可以直接修改fa数组了。 为了实现这点,可以开2×n个节点,初始时i的父节点是i+n,这样在合并时可以保证前n个节点一定一直都是叶子...

初学并查集的例题2 UVA 11987 Almost Union-Find

贴出ac的代码,以及思考中遇到的cuo'wu //很明显并查集的题目(题目已经说了)需要一点技巧 //采用一个不会是元素的大于maxn整数来当作根节点,这样就不会产生一个节点是跟节点 //其实是...

UVA - 11987 Almost Union-Find(并查集)

题意是需要写一个不相交集,有三种操作,第一种是,把包含片p和q元素的集合合并,如果p、q在同一集合,则忽视这个操作 第二种操作是把p加入到q所在的集合,如果p、q在同一集合,则忽视这个操作 第三中...

UVA 11987 Almost Union-Find(hash + 并查集)

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem...

Almost Union-Find(Uva 11987)并查集

来自《算法竞赛入门经典训练指南》 1.题目原文 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=s...

UVA 11987 Almost Union-Find 并查集的删除操作 懒惰标记

你的任务是实现一个并查集的变种。 1 q p 合并 q,p 所在 集合。 2 q p 把 q 移动到 p 所在集合。 3 p  查询 p所在集合的元素个数与元素和。 一开始想使用set...

UVA 11987 Almost Union-Find(并查集)

题意:初始有N个集合,分别为 1 ,2 ,3 .....n。有三种操件 1 p q 合并元素p和q的集合 2 p q 把p元素移到q集合中 3 p 输出p元素集合的个数及全部元素的和。 思...

UVa 11987 Almost Union-Find (加权并查集&删除结点的技巧)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3138 ...

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

Almost Union-Find Time Limit: 1000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu ...

UVA - 11987 Almost Union-Find (并查集可删除)(两种方法)

Almost Union-Find Time Limit: 1000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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