【ZCMU1930】帽子戏法(并查集)
题目链接
1930: 帽子戏法
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 88 Solved: 24
[Submit][Status][Web Board]
Description
小A家有很多很多顶帽子初始时帽子都是独立分开的,每顶帽子都有一个编号用于区分.小A会有以下操作之一:
1.将编号为y的帽子所在的帽子堆放在编号为x的帽子所在的帽子堆顶上,如果x,y在同一堆则不做任何动作.
2.小A会向你询问编号为x的帽子上方有多少只帽子.
Input
输入有多组数据:
第一行输入N,M分别为帽子数和操作数(1<=N<=40000,1<=M<=400000)
帽子的编号对应1,2,3...,N.
接下来有M行输入为 T x y 对应操作1. Q x 对应操作2.
Output
对于小A的询问输出位于编号为x的帽子上方的帽子数.
Sample Input
2 2
T 1 2
Q 1
Sample Output
1
HINT
Source
lcf
【解题思路】
num[i]:每个帽子上的帽子数
pos[i]:每个帽子堆的帽子数,i 是这堆帽子的最上面的帽子编号
需要注意的是在每一次合并的时候是把两个根节点合并,也就是说num数组只更新该点到根节点那条路径上的值,但是根节点的其他儿子节点并没有被更新,所以在查询的时候,需要再用并查集遍历一遍查询节点的路径上的num。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=4e5+5;
int pre[maxn],num[maxn],pos[maxn];
//num表示每个帽子上的帽子数 pos表示每个帽子堆的帽子数
int findroot(int x)
{if(x!=pre[x]){int fx=pre[x];pre[x]=findroot(pre[x]);num[x]+=num[fx];}return pre[x];
}
int main()
{int n,m;while(~scanf("%d%d",&n,&m)){for(int i=0;i<=n;i++){pre[i]=i;num[i]=0;pos[i]=1;}while(m--){char ch=getchar();while(ch!='T'&&ch!='Q')ch=getchar();if(ch=='T'){int x,y;scanf("%d%d",&x,&y);int fx=findroot(x),fy=findroot(y);if(fx!=fy){pre[fx]=fy;num[fx]+=pos[fy];pos[fy]+=pos[fx];}}else{int x;scanf("%d",&x);findroot(x);printf("%d\n",num[x]);}}}return 0;
}
【ZCMU1930】帽子戏法(并查集)相关推荐
- 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈
题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...
- HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集
题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...
- HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法
tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...
- POJ - 2513 Colored Sticks 欧拉通路+并查集+静态树
一开始想用map来搞,但是感觉好复杂,然后想了一下看大佬们用trie做的,感觉十分合理就敲了一发. 一开始re,数组要开到550000 只会静态的字典树,在每个根节点看是否出现过改颜色,如果没有就把该 ...
- 关于 并查集(union find) 算法基本原理 以及 其 在分布式图场景的应用
二月的最后一篇水文-想写一些有意思的东西. 文章目录 环检测在图数据结构中的应用 深度/广度优先 检测环 并查集数据结构 (Union-Find) 基本概念 初始化 合并 union 查找祖先 优化1 ...
- 【BZOJ1015】【JSOI2008】星球大战 并查集
题目大意 给你一张\(n\)个点\(m\)条边的无向图,有\(q\)次操作,每次删掉一个点以及和这个点相邻的边,求最开始和每次删完点后的连通块个数. \(q\leq n\leq 400000,m\le ...
- 并查集 HDOJ 1232 畅通工程
题目传送门 1 /* 2 并查集(Union-Find)裸题 3 并查集三个函数:初始化Init,寻找根节点Find,连通Union 4 考察:连通边数问题 5 */ 6 #include <c ...
- 1013 Battle Over Cities(并查集解法)
关于背景的介绍见1013 Battle Over Cities(图的DFS解法) DFS就是不算特定结点后数连通子图的总数,再减一.我想着那么并查集就是数不算特定节点后,集合元素(根)的个数.但是我弄 ...
- 并查集专题练习:好朋友(未完待续)
有空再把题目补上 输入样例1 4 2 1 4 2 3 样例输出1 2 输入样例2 7 5 1 2 2 3 3 1 1 4 5 6 输出样例2 3 解题思路: 1. 这题放在并查集的专题后面,有查找也有 ...
最新文章
- linux 终端 渐变色,iOS开发——UI篇文字渐变效果:图层中的mask属性
- python爬取图片-Python超简单的爬取网站中图片
- android游戏开发框架libgdx的使用(完)—杂谈Libgdx
- Linux-重装系统之静态ip配置
- JdbcTemplate和NamedParameterJdbcTemplate
- python使用rabbitMQ介绍五(话题模式)
- 表单设置默认值_你还不知道表单怎么设计吗?看这里!
- (转)基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍
- 在谈判中别无选择的时候,怎么办?
- ios-Text inset for UITextField
- ubuntu安装transmission下载BT
- PHP之 通过银行卡账号匹配银行名称
- 为什么要进行网站重构呢?
- 最美春三月,又到一年迎新时——烟台北大青鸟喜迎2019级新生入学报到
- MATLAB 线性动态范围调整
- 泛型---上界通配符和下界通配符
- Stream 大数据量List分批处理 java8
- 【SQL server 期末复习】
- 计算机网络路由器配置实验怎么做,计算机网络路由器配置实验
- 基于oracle的餐馆评价系统,美团大众点评优化评价系统 助力餐饮商家做好口碑营销...
热门文章
- 中国人寿在线笔试可以用计算机嘛,中国人寿集团校园招聘笔试经验
- java 电子时钟_java多线程编程制作电子时钟
- SecureCRT 命令行备注
- dd命令(dd命令制作镜像)
- computer_network CPT实验
- 位 字节 千字节 兆字节 (bit Byte KByte MByte GByte TByte)
- 现在有的年轻人想法有点畸形
- 利用put、move的请求方式对IIS6.0服务器上传执行asp木马
- firefox Chrome浏览器redux devTools调试工具
- win2003 apache php5.4 mysql_win2003下Apache2.4+PHP5.4+mysql5.6的搭建