题意:

有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. spring aop advice

    1.前置通知(BeforeAdvice): import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAd ...

  2. OpenGL 圆角矩形

    本来打算用四个圆角GL_TRIANGLE_FANS+两个矩形来填充, 后来经无情公子的提醒, 突然发现:"尼玛就是一压扁了的圆啊!" 于是全部用GL_TRIANGLE_FANS, ...

  3. Android SDK Tools和Android SDK Platform-tools

    SDK Platform 可以理解为版本,因此有 SDK Platform 7,SDK Platform 8等等Android SDK Tools 是各个版本都可通用的工具文件夹,里面有draw9pa ...

  4. inner Join on 随随随随随便一记

                                   幼儿园大班生(随便的记一记) JOIN 分为:内连接(INNER JOIN).外连接(OUTER JOIN).其中,外连接分为:左外连接( ...

  5. (六)play之yabe项目【验证码】

    (六)play之yabe项目[验证码] 博客分类: 框架@play framework   添加验证码功能 在Application.java中添加一个action:captcha() /** * 添 ...

  6. 【JWPlayer】官方JWPlayer去水印步骤

    在前端播放视频,现在用html5的video标签已经是一个不错的选择,不过有时候还是需要用StrobeMediaPlayback.JWPlayer这一类的flash播放器,JWPlayer的免费版本带 ...

  7. CSS动态伪类选择器温故-3

    动态伪类选择器 伪类选择器:大家熟悉的:[:link][:visited][:hover][:active]CSS3的伪类选择器分为六种:(1)动态伪类选择器(2)目标伪类选择器(3)语言伪类选择器( ...

  8. [js开源组件开发]js多选日期控件

    js多选日期控件 详情请见:http://www.lovewebgames.com/jsmodule/calendar.html 它的github地址:https://github.com/tianx ...

  9. http服务&ajax编程

    http服务&ajax编程 1.服务器 前言:通俗的讲,能够提供某种服务的机器(计算机)称为服务器 1.1.服务器类型 按照不同的划分标准,服务可划分为以下类型: 按服务类型可分为:文件服务器 ...

  10. RHEL7文件查找

    本文介绍RHEL7下which.whereis.locate.find命令的使用,重点介绍find命令的使用 which 命令:which 作用:查找命令的执行文件路径 语法:which [选项] [ ...