POJ 1988 Cube Stacking || HDU 2818 Building Block

举报
Linux猿 发表于 2021/08/06 00:02:56 2021/08/06
【摘要】 题目链接~~> 做题感悟:这题开始被吓到了,一看是多校练习赛,在 HDU 提交了 n 次都是栈溢出,但是在 POJ 1 A.(哪位大牛路过麻烦看一下挫代码为什么在POJ上可以过在HDU上过不了)真无语!! 解题思路:方法一、先说我的思路吧: 题意中 M x y  是把 y 接到 x的下面,最后求 x下面有多少个木块,其实可以转化为把y ...

题目链接~~>

做题感悟:这题开始被吓到了,一看是多校练习赛,在 HDU 提交了 n 次都是栈溢出,但是在 POJ 1 A.(哪位大牛路过麻烦看一下挫代码为什么在POJ上可以过在HDU上过不了)真无语!!

解题思路:方法一、先说我的思路吧: 题意中 M x y  是把 y 接到 x的下面,最后求 x下面有多少个木块,其实可以转化为把y 放到x上面,进而求x上面有多少个。但是这样的话必须开两个并查集, 假如 M 1 6  M 2 4  M 2 6  查询C 4 答案为 2 可以用一个并查集fa[] fa[1‘]=6’ (1‘,6'均指其父亲) fa[2']=4' (这个并查集起主要作用)如果你要实现 M 2 6 必须找到2的父亲和6的最小的孙子让6最小的孙子成为2父亲的父亲(简单说就是让2的父亲接在6的孙子后面),至于查询的时候 执行一次并查集就可以得到x上面有多少个(题中是下面有多个).

                方法二、其实可以用一个数组记录节点总的个数(这样HDU可以过)其它上面的差不多具体见这里~>.

代码:


  
  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<map>
  4. #include<stack>
  5. #include<string>
  6. #include<string.h>
  7. #include<stdlib.h>
  8. #include<math.h>
  9. #include<vector>
  10. #include<queue>
  11. #include<algorithm>
  12. using namespace std ;
  13. #define LEN sizeof(struct node)
  14. const double PI = 3.1415926 ;
  15. const double INF = 99999999 ;
  16. const int MX =30005 ;
  17. int fa[MX],fb[MX],num[MX] ;
  18. int FA(int x)
  19. {
  20. if(fa[x]!=x)
  21. {
  22. int y=FA(fa[x]) ;
  23. num[x]+=num[fa[x]] ;// 更新权值
  24. return fa[x]=y ;
  25. }
  26. else return x ;
  27. }
  28. int FB(int x) // 寻找子节点
  29. {
  30. return fb[x]==x ? x : fb[x]=FB(fb[x]) ;
  31. }
  32. void init() // 初始化
  33. {
  34. for(int i=0 ;i<=30001 ;i++)
  35. {
  36. fa[i]=i ;
  37. fb[i]=i ;
  38. num[i]=0 ;
  39. }
  40. }
  41. int main()
  42. {
  43. char ch ;
  44. int m,x,y,ax,ay ;
  45. scanf("%d",&m) ;
  46. init() ;
  47. for(int i=0 ;i<m ;i++)
  48. {
  49. cin>>ch ;
  50. if(ch=='M')
  51. {
  52. scanf("%d%d",&x,&y) ;
  53. if(x!=y)
  54. {
  55. ax=FA(x) ; // 找子节点
  56. ay=FB(y) ; // 找父亲节点
  57. if(ax!=ay)
  58. {
  59. fa[ax]=ay ; // 用于查询
  60. num[ax]++ ; // 不要忘记!!
  61. fb[ay]=ax ;
  62. }
  63. }
  64. }
  65. else
  66. {
  67. scanf("%d",&x) ;
  68. FA(x) ;
  69. printf("%d\n",num[x]) ;
  70. }
  71. }
  72. return 0 ;
  73. }


 

 

 

 

 

文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/22189899

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。