题意:有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];elserank[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. 【数据结构】判断一个单链表中各结点的值是否有序

    count记录的是单链表的总长 count1记录的是升序的结点的个数 count2记录的是降序的结点的个数 如果count1或者count2等于count,那么就说明该序列是升序或者降序的. 稍加改进 ...

  2. 如何判断一个字符串里有多少个汉字?(原理及过程)

           前言:在站里看到许多关于这个问题的文章,都大差不差,但基本用的java语言,且讲述原理的过程比较繁琐.晦涩,不适于c语言初学者.文中涉及到区位码.国标码.机内码的转换,可跳过. 解该题目 ...

  3. 设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的)

    设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的). #include <stdio.h> #include<malloc.h> typedef str ...

  4. 数据结构例9.编写一个算法,将带头结点的单向链表 拆分成一个奇数链表和一个偶数链表,并分别输出

    /* 编写一个算法,将带头结点的单向链表 拆分成一个奇数链表和一个偶数链表,并分别输出 */ # include <iostream> # include <stdlib.h> ...

  5. 4.python蓝桥杯模拟题 一个包含有2019个结点的有向图,最多包含多少条边?(不允许有重边)

    4.python蓝桥杯模拟题 一个包含有2019个结点的有向图,最多包含多少条边?(不允许有重边) 1.用n表示图中顶点的数目,e表示边或者弧的数目,则对于无向图来说,e的取值范围为0-(1/2)n( ...

  6. Java判断一个整数有多少位

    Java判断一个整数有多少位 首先,封装一个判断位数的方法:使用for循环进行判断整数的位数.直到传进的整数小于数组中某个值时,停止循环. /*** 获取整数有多少位* @param num 要判断的 ...

  7. 判断一个图是否为树(有向图以及无向图)

    整理的算法模板合集: ACM模板 目录 判断一个图是否为树 1. 无向图(hdu 1272 小希的迷宫) 2. 有向图(hdu 1325 Is It A Tree?) 判断一个图是否为树 1. 无向图 ...

  8. 单链表——判断一个单链表中是否有环

    2019独角兽企业重金招聘Python工程师标准>>> package jxau.lyx.link;/*** * @author: liyixiang* @data:2014-10- ...

  9. 算法练习day9——190327(“之” 字形打印矩阵、在行列都排好序的矩阵中找数、打印两个有序链表的公共部分、判断一个链表是否为回文结构)

    1."之" 字形打印矩阵 [题目] 给定一个矩阵matrix, 按照"之" 字形的方式打印这个矩阵, 例如: 1 2 3 4 5 6 7 8 9 10 11 1 ...

最新文章

  1. 从难免的线上bug说起代码的思考
  2. 牛博威:成熟的反外挂系统一般企业未必能承受
  3. TP5 MYSQL按照原来的IN顺序查询
  4. Scala集合:Map集合
  5. Spring Cloud Gateway——2020.x以上版本HTTP 503 或 NoLoadBalancer[负载均衡]解决方案
  6. 漫画TCP——一个悲伤的故事
  7. document.body.scrollTop的值为零问题
  8. LeetCode 1626. 无矛盾的最佳球队(最大上升子序DP)
  9. python 排列组合_python 编写排列组合
  10. springboot 物联网_Confluent Kafka,KSQL,Spring Boot和分布式SQL开发物联网实战
  11. STL----nth_element
  12. vue-property-decorator
  13. java image 内存不足_java内存不足的解决方法
  14. 为什么独立站卖家都在WhatsApp上进行销售?
  15. Swift是花拳绣腿吗?——谈谈开发语言与程序员的职业发展
  16. eclipse项目名旁边一个红xx,解决办法
  17. win11+kodcloud、h5ai+phpstudy+ipv6搭建私人云盘、私人影院
  18. 高新技术企业认定评分标准
  19. 【云原生工具集】洋气·给程序自定义启动图案
  20. 9.条件语句(if语句)

热门文章

  1. Windows服务器补丁列表及介绍_传奇单机架设,列表读取失败?单机架设经常遇到的问题分享!...
  2. c++ 类数组_《深入java虚拟机》读书笔记类加载
  3. mysql 备份 第三方工具_Mysql第三方备份工具Xtrabackup使用说明
  4. php获得帮助类数据_PHP实现的一个时间帮助类
  5. Cloud Programming Simplifie : A Berkeley View on Serverless Computing
  6. centos losf 安装_Linux Centos7部署环境安装-CentOS
  7. Nginx环境下PHP flush失效的解决方法
  8. iis应用程序池监控方法实例
  9. JavaScript基础(一)基本认识
  10. C# 在DataGridView中,点击单元格调出 TreeView控件 或 ListBox控件