此题最难处理的操作就是将一个单点改变集合,而普通的并查集是不支持这种操作的。

当结点p是叶子结点的时候,直接pa[p] = root(q)是可以的,

p没有子结点,这个操作对其它结点不会造成任何影响,

而当p是父结点的时候这种操作会破坏子节点的路径,因此必须保留原来的路径。

我们希望pa[p] = root(q)的同时又保留原来的路径,那么只需要在点上做一个标记,

如果这个点被标记,就沿着新的路径寻找。

此时在修改操作的时候这个点一定是叶子结点,所以可以直接pa[p] = root(q),

而原来的点则变成一个虚点用来保留了原来的路径。

改变集合的操作以及查询都只涉及到单点,这个标记只影响这个点,在二次以及以上的寻找还是要按照原来的路径。

#include<bits/stdc++.h>
using namespace std; const int maxn = 1e5+;
int fa[maxn],fa2[maxn],cnt[maxn],sum[maxn];
bool fg[maxn];
int Find(int x,bool d) {
if(fg[x]&&d) return Find(fa2[x],false);
return x==fa[x]?x:fa[x]=Find(fa[x],false);
}
int main()
{
//freopen("in.txt","r",stdin);
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i = ; i <= n; i++) fa[i]=i,fg[i]=false,cnt[i]=,sum[i]=i;
while(m--){
int op,p,q; scanf("%d%d",&op,&p);
if(op!=){
scanf("%d",&q);
int x = Find(p,true), y = Find(q,true);
if(op == ){
if(x!=y){
cnt[y] += cnt[x];
sum[y] += sum[x];
fa[x] = y;
}
}else {
if(x!=y){
cnt[x]--,sum[x]-=p;
cnt[y]++,sum[y]+=p;
fg[p] = true;
fa2[p] = y;
}
}
}else {
int x = Find(p,true);
printf("%d %d\n",cnt[x],sum[x]);
}
}
}
return ;
}

最新文章

  1. 如何在Chrome下Debug Mocha的测试
  2. Oracle 11g系列:视图
  3. 在 Xen 虚拟机下修改系统当前时间
  4. 非常详细GC学习笔记
  5. QTableView使用自定义委托(QItemDelegate)
  6. H面试程序(11): 判断字符串是否包含子串问题
  7. Login failed for user &#39;NT AUTHORITY\NETWORK SERVICE&#39;的解决方法
  8. 【DateStructure】 Charnming usages of Map collection in Java
  9. ASF(传感器)
  10. dfs算法
  11. 时间相关库&lt;ctime&gt;解析
  12. python3 第十一章 - 数据类型之str(字符串)
  13. story 泄露服务器libc版本
  14. Activity切换的时候生命周期的变化
  15. Ajax - 汇总
  16. while循环中出现ssh导致读取文件错误
  17. [Mac入门]如何在Mac下显示Finder中的所有文件
  18. 图表ASP:Chart
  19. No.01——配置编程环境
  20. jquery.cookie.js $.cookie()是怎么使用

热门文章

  1. 二十五种网页加速方法和seo优化技巧
  2. The web.config file for this project is missing the required DirectRequestModule.
  3. [小工具] C#多线程|匿名委托传参数|测试网站压力--升级版
  4. WPF语言切换,国际化
  5. VisualStudio2017中新建的ASP.NET Core项目中的各个文件的含义
  6. header元素 footer元素 hgroup元素
  7. Mujin Programming Challenge 2017A - Robot Racing【思维题】
  8. 洛谷P2867 [USACO06NOV]大广场Big Square
  9. codevs1105 过河
  10. 洛谷 P2731 骑马修栅栏 Riding the Fences