题意:

有N个齿轮,三种操作
1.操作L x y:把齿轮x,y链接,若x,y已经属于某个齿轮组中,则这两组也会合并。
2.操作Q x y:询问x,y旋转方向是否相同(等价于齿轮x,y的相对距离的奇偶性)。
3.操作D x :拆下齿轮x,并且x所在的齿轮组不会断开
4.操作S x : 查询齿轮x所在的齿轮组有多少齿轮。
并查集,维护父节点的同时,dis记录一下每个节点到根节点的距离,并且用num记录一下以x为根节点的集合有多少个元素。

由于涉及到删除操作,删除的是根节点的话会导致信息丢失,所以在删除的时候直接新建一个节点,所以再加一个变量,表示节点x所对应的实际节点编号mp[x]。

这样fa[x]表示x的父节点,mp[x]表示x实际的编号(从N+1开始记)

(copied)

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define N 600007
#define M 33 int fa[N],n,m,dis[N];
int num[N],mp[N]; int findset(int x)
{
if(x != fa[x])
{
int tmp = findset(fa[x]);
dis[x] += dis[fa[x]]; //累加距离
fa[x] = tmp;
}
return fa[x];
} void init()
{
for(int i=;i<=n+m;i++)
{
fa[i] = i;
num[i] = ;
dis[i] = ;
mp[i] = i;
}
} int main()
{
int i,u,v,k;
char ss[];
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
int now = n+;
while(m--)
{
scanf("%s",ss);
if(ss[] == 'L')
{
scanf("%d%d",&u,&v);
u = mp[u]; //实际的位置
v = mp[v];
int fx = findset(u);
int fy = findset(v);
if(fx != fy)
{
fa[fx] = fy;
//dis[fx] = dis[fy]+1; //1
//dis[u] = dis[v]+1; //2 **1,2顺序不能反,或者直接用下面**
dis[fx] = dis[u]+dis[v]+; //与根距离之和的奇偶性再反一下,得出相对距离的奇偶性
num[fy] += num[fx];
}
}
else if(ss[] == 'Q')
{
scanf("%d%d",&u,&v);
u = mp[u]; //实际的位置
v = mp[v];
int fx = findset(u);
int fy = findset(v);
if(fx != fy)
puts("Unknown");
else
{
if(abs(dis[u]-dis[v]) & )
puts("Different");
else
puts("Same");
}
}
else if(ss[] == 'S')
{
scanf("%d",&u);
int tu = mp[u];
printf("%d\n",num[findset(tu)]);
}
else
{
scanf("%d",&v);
int tv = mp[v];
num[findset(tv)]--;
mp[v] = now++;
}
}
}
return ;
}

2014 Super Training #8 A Gears --并查集的更多相关文章

  1. 2014 Super Training #8 B Consecutive Blocks --排序+贪心

    当时不知道怎么下手,后来一看原来就是排个序然后乱搞就行了. 解法不想写了,可见:http://blog.csdn.net/u013368721/article/details/28071241 其实就 ...

  2. 2014 Super Training #9 E Destroy --树的直径+树形DP

    原题: ZOJ 3684 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3684 题意: 给你一棵树,树的根是树的中心(到其 ...

  3. 2014 Super Training #9 C E - Cup 2 --记忆化搜索

    原题:ZOJ 3681 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3681 题意:给一个m,n,m表示m个人,可以把m个 ...

  4. 2014 Super Training #6 H Edward's Cola Plan --排序+二分

    原题: ZOJ 3676  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3676 题意:给每个朋友一瓶可乐,可乐有普通和高 ...

  5. 2014 Super Training #7 F Power of Fibonacci --数学+逆元+快速幂

    原题:ZOJ 3774  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3774 --------------------- ...

  6. 2014 Super Training #7 C Diablo III --背包问题(DP)

    原题: ZOJ 3769 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3769 一个带有一些限制的背包问题. 假设在没有限 ...

  7. 2014 Super Training #7 E Calculate the Function --矩阵+线段树

    原题:ZOJ 3772 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3772 这题算是长见识了,还从没坐过矩阵+线段树的题 ...

  8. 2014 Super Training #7 B Continuous Login --二分

    原题:ZOJ 3768 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3768 一个结论:一个正整数总能用不超过三个前n项相 ...

  9. 2014 Super Training #10 G Nostop --矩阵快速幂

    原题: FZU 2173 http://acm.fzu.edu.cn/problem.php?pid=2173 一开始看到这个题毫无头绪,根本没想到是矩阵快速幂,其实看见k那么大,就应该想到用快速幂什 ...

随机推荐

  1. oracle sql 语句优化

    (1)选择最有效率的表名顺序(只在基于规则的优化器中有效):Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理 ...

  2. Hibernate的初步

    1.简介 在java开发领域,基于数据库应用的设计与实现一直都是面向关系的,Hibernate对象/关系映射ORM框架的出现为java面向对象开发提供了易于使用的数据持久化解决方案. ORM介绍: ( ...

  3. .NET Core常用配置文件示例

    .NET Core相关地址: 1.官网:https://www.microsoft.com/net 2..NET Core:http://dotnet.github.io/3.Getting Star ...

  4. Android 手机卫士12--进程管理

    1.本进程不能被选中,所以先将checkbox隐藏掉--手机卫士 不能自杀 if(getItem(position).packageName.equals(getPackageName())){ ho ...

  5. Angular框架

    Angular 框架 Angular介绍 库和框架的区别 jQuery:库 库一般都是封装了一些常用的方法 自己手动去调用这些方法,来完成我们的功能 code $('#txt').val('我是小明' ...

  6. 再谈visibility:hidden和display:none

    之前写过一篇有关visibility:hidden和display:none的文章:为什么要用用visibility:hidden;代替display:none;?主要是从浏览器性能方面入手,却没写两 ...

  7. PHP写日志函数

    初学,写一个函数用于存储日志调试. function WriteLog($msg) { $filename = dirname(__FILE__) ."\\Debug.log"; ...

  8. ruby 操作数据库语句

    1.多对多 user role u = User.first role = Role.first 插入 u.roles << role u.save 更新 u.roles = [] u.r ...

  9. TreeView递归绑定无限分类数据

    TreeView递归绑定无限分类数据 实现一个动态绑定,无限级分类数据时,需要将数据绑定到TreeView控件,分类表的结构是这样的: 字段 类型 Id int ParentId int Name N ...

  10. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q125-Q126)

    Question 125You are creating an application for SharePoint Server 2010.The application will run on a ...