题意:有n个元素,开始每个元素自己一栈,有两种操作,将含有元素x的栈放在含有y的栈的顶端,合并为一个栈。第二种操作是询问含有x元素下面有多少个元素。

6
M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
输出:
1
0
2 思路:这道题,说不上很难,额,解决它也的确花了比较长的时间。询问x元素下面有多少个元素,那么我只需要统计x元素上面有多少个元素,再用x所在的并查集的根节点的元素个数减去x元素上面的元素个数,
结果就出来了......当然,还是有些细节地方要说说的,在路径压缩的时候,有个rang[][3],其中rank[x][0],代表元素x上面有多少个元素,rank[x][1]代表元素x下面有多少个元素,rank[x][2]判断x元素
是否为某个子并查集的根节点。
如果某个结点x的父亲结点y曾经为某一个子并查集的根节点,那么,说明对于这个结点x已经是在y为根节点的时候压缩过了,那么当y不为根节点了,就不必再重新x对y的路径了,只需要直接更新,x对于新的根节点的路径
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int father[30005],rank[30005][3];
int flag=0;
int find(int x)
{
if(rank[x][0]==0)
rank[x][2]=1;
if(x==father[x])
return x;
int tmp=father[x];
father[x]=find(father[x]);
int root=father[x];
if(tmp==root)
{
rank[root][1]+=rank[x][1];
rank[x][1]=0;
//if(rank[root])
/*if(flag==1)
{
printf("1: %d %d %d %d\n",x,tmp,rank[x][0],rank[tmp][0]);
}*/
}
else
{
rank[root][1]+=rank[x][1];
rank[x][1]=0;
if(rank[tmp][2]==1) //曾经为某一颗子并查集的根结点,那么它下面的结点直接+上根节点的值就是
rank[x][0]+=rank[tmp][0];
else
rank[x][0]=rank[tmp][0]+1;
/*if(flag==1)
{
printf("2: %d %d %d %d\n",x,tmp,rank[x][0],rank[tmp][0]);
}*/
}
return root;
}
void liantong(int tmp,int tmp1)
{
int x=find(tmp);
int y=find(tmp1);
father[y]=x;
rank[y][0]=rank[x][1];
rank[x][1]+=rank[y][1];
rank[y][1]=0;
}
int main()
{
int n;
scanf("%d",&n);
{
for(int i=0; i<=30001; i++)
{
father[i]=i;
rank[i][0]=0;
rank[i][1]=1;
rank[i][2]=0;
}
while(n--)
{
char ch[10];
scanf("%s",ch);
if(ch[0]=='M')
{
int tmp,tmp1;
scanf("%d%d",&tmp,&tmp1);
int x=find(tmp);
int y=find(tmp1);
if(x!=y)
liantong(tmp,tmp1);
// find(tmp);
// find(tmp1);
}
else
{
int k;
scanf("%d",&k);
if(k==17)
flag=1;
int ans=rank[find(k)][1];
/*if(rank[k][0]==0)
printf("%d\n",rank[k][1]-1);
else*/
printf("%d\n",ans-rank[k][0]-1);
}
}
}
return 0;
}
/*
110
M 12 14
M 15 16
M 16 17
M 12 17
C 17
*/

poj1988(判断一个结点下面有多少个结点,推荐)的更多相关文章

  1. Trailing Zeroes (III) 假设n!后面有x个0.现在要求的是,给定x,要求最小的n; 判断一个n!后面有多少个0,通过n/5+n/25+n/125+...

    /** 题目:Trailing Zeroes (III) 链接:https://vjudge.net/contest/154246#problem/N 题意:假设n!后面有x个0.现在要求的是,给定x ...

  2. pta 奇数值结点链表&&单链表结点删除

    本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中奇数值的结点重新组成一个新的链表.链表结点定义如下: struct ListNode { int data; ListNode *next; ...

  3. C/C++中创建(带头结点、不带头结点的)单链表

    1.带头结点的单链表(推荐使用带头结点的单链表)(采用尾插法) 了解单链表中节点的构成 从上图可知,节点包含数据域和指针域,因此,在对节点进行定义时,我们可以如下简单形式地定义: /* 定义链表 */ ...

  4. Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect)

    Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect) [TOC] 这两个方法的区别 View.ge ...

  5. excel批处理_判断一个名称是不是药品

    把药品名称导入到sheet1的A字段 # -*- coding: utf-8 -*-"""Created on Fri Dec  9 09:38:58 2016判断一个名 ...

  6. 判断一个字符串str不为空的方法

    1.str == null; 2."".equals(str); 3.str.length 4.str.isEmpty(); 注意:length是属性,一般集合类对象拥有的属性,取 ...

  7. Android 如何判断一个应用在运行(转)

    Android 如何判断一个应用在运行  在一个应用中,或一个Service .Receiver中判断一个应用是否正在运行,以便进行一些相关的处理. 这个时候我们需要得到一个ActivityManag ...

  8. ZOJ Problem Set - 1331 Perfect Cubes 判断一个double是否为整数

    zju对时间要求比较高,这就要求我们不能简单地暴力求解(三个循环搞定),就要换个思路:因为在循环时,已知a,确定b,c,d,在外重两层循环中已经给定了b和c,我们就不用遍历d,我们可以利用d^3=a^ ...

  9. PHP如何判断一个数组是一维数组或者是二维数组?用什么函数?

    如题:如何判断一个数组是一维数组或者是二维数组?用什么函数? 判断数量即可 <?php if (count($array) == count($array, 1)) { echo '是一维数组' ...

随机推荐

  1. strace命令解析

    strace常用于跟踪和分析进程执行时中系统调用和耗时以及占用cpu的比例,常用的格式如下: 1.sudo /usr/bin/strace -Ttt -p pid 2>pid.log 跟进pid ...

  2. [转]expect实现ssh自动交互

    shell脚本实现ssh自动登录远程服务器示例: #!/usr/bin/expect spawn ssh root@192.168.22.194 expect "*password:&quo ...

  3. Sqlserver大数据量分区表创建

    /* 逆向删除对象 DROP PARTITION SCHEME [PS_BasicPolicy2014]; DROP PARTITION FUNCTION [PF_BasicPolicy2014]; ...

  4. C++转型操作符

    转:http://www.cnblogs.com/hazir/archive/2012/04/14/2447251.html 旧式的C转型方式,几乎允许你将任何类型转换为任何其它类型,有其自身的缺陷, ...

  5. AaronYang的留言板

    ^_^很开心能在这里遇到你,我是ay,英文名叫aaronyang,真名叫杨洋,安徽六安的,有老乡吗?这里的文章几乎都是我原创的,要不然就是收集别人的好的文章,自己再整理下与大家分享.绝对希望原创,本站 ...

  6. 使用grep恢复被删文件内容

    在Unix/Linux下,最危险的命令恐怕就属rm命令了,每次在root下使用这个命令的时候,我都要盯着命令行看上几分钟才敢把回车敲下去.以前,看到同事在脚本中使用rm命令 —— rm {$App_D ...

  7. Windows键盘消息处理

    原文链接: http://blog.sina.com.cn/s/blog_5f8817250100taab.html 本文大部分来自MSDN和网友的博客,我在实践的基础上再作了一些总结. 1,虚拟键( ...

  8. iOS 9 学习系列: Xcode Code Coverage

    Code coverage 是一个计算你的单元測试覆盖率的工具. 高水平的覆盖给你的单元測试带来信心.也表明你的应用被彻底的測试过了. 你可能写了几千个单元測试,但假设覆盖率不高.那么你写的这套測试可 ...

  9. SaaS多租户模式数据存储方案

    云计算多租户几乎用于所有软件即服务 (Software as a Service, SaaS) 应用程序,因为计算资源是可伸缩的,而且这些资源的分配由实际使用决定.话虽如此,用户可以通过 Intern ...

  10. Java:集合,对列表(List)中的自定义对象按属性(字段)排序(正序、倒序)的方法

    1. 要求 对列表(List)中的自定义对象,要求能够按照对象的属性(字段)进行排序(正序.倒序). 如:用户对象(Member)有用户名(username).级别(level).出生日期(birth ...