洛谷 P2342 叠积木 题解
本蒟蒻又来发题解了
这题是不是有点像并查集,但是那个询问的个数是不是有点骚;
所以,普通的并查集是无法解决这个问题的,这个时候就需要用到带权并查集了;
每次跑的时候都记录下它的下面有几个点,然后询问的时候的复杂度是O(1)的;
好,接下来就可以愉快的码代码了:
include<bits/stdc++.h>
using namespace std;
define maxn 500010
char ch;
int n, x, y, fa[maxn], sum[maxn], num[maxn];
//比常规的并查集多了一行
int find(int x)
{
if(fa[x] == x)
return x;
sum[x] += sum[fa[x]];//还需要统计它下面的积木数
return fa[x] = find(fa[x]);
}
//fa[]就不说了,sum[]是来存它下面的积木数,num[]是这一列的积木数;
int main()
{
scanf("%d", &n);
for(int i = 1; i <= maxn; ++ i)
{
fa[i] = i;//嗯,它的祖先就是它自己,常规操作;
sum[i] = 0;//它的下面QwQ肯定没有积木啊
num[i] = 1;//目前这一列只有一个积木
}
for(int i = 1; i <= n; ++ i)
{
cin >> ch;
if(ch == 'M')//如果这是'M',那就要合并
{
scanf("%d%d", &x, &y);
x = find(x), y = find(y);
if(x != y)//如果他们的祖先不同,就是他们不在同一个联通块上
{
fa[x] = y;//合并它们
sum[x] = num[y]; //数量要相加
num[y] += num[x]; //因为x要和y合并
}
}
else
{
scanf("%d", &x);
find(x);//还需要再来一次;
printf("%d\n", sum[x]);//O(1)输出;
}
}
return 0;
}
嗯,你愉快的拿了27分;
好,开始查错了,
戴上眼镜,睁大眼睛
哪里有错?
就是过不去数据,哎;
好吧,我猜这么神仙的你们肯定找到哪里错了,不像蒟蒻我(划掉
include<bits/stdc++.h>
using namespace std;
define maxn 500010
char ch;
int n, x, y, fa[maxn], sum[maxn], num[maxn];
//fa[]就不说了,sum[]是来存它下面的积木数,num[]是这一列的积木数;
//比常规的并查集多了一行
int find(int x)
{
if(fa[x] == x)
return x;
int f = find(fa[x]);
sum[x] += sum[fa[x]];//还需要统计它下面的积木数
return fa[x] = f;
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= maxn; ++ i)
{
fa[i] = i;//嗯,它的祖先就是它自己,常规操作;
sum[i] = 0;//它的下面QwQ肯定没有积木啊
num[i] = 1;//目前这一列只有一个积木
}
for(int i = 1; i <= n; ++ i)
{
cin >> ch;
if(ch == 'M')//如果这是'M',那就要合并
{
scanf("%d%d", &x, &y);
x = find(x), y = find(y);
if(x != y)//如果他们的祖先不同,就是他们不在同一个联通块上
{
fa[x] = y;//合并它们
sum[x] = num[y]; //数量要相加
num[y] += num[x]; //因为x要和y合并
}
}
else
{
scanf("%d", &x);
find(x);//还需要再来一次;
printf("%d\n", sum[x]);//O(1)输出;
}
}
return 0;
}
有没有发现哪里错了,
是的,就是在find函数里面;
第一个代码是:
int find(int x)
{
if(fa[x] == x)
return x;
sum[x] += sum[fa[x]];//还需要统计它下面的积木数
return fa[x] = find(fa[x]);
}
第二个代码是:
int find(int x)
{
if(fa[x] == x)
return x;
int f = find(fa[x]);
sum[x] += sum[fa[x]];//还需要统计它下面的积木数
return fa[x] = f;
}
是吧,第一个是先更新sum[],再递归;
而第二个是先递归,再更新sum[];
所以,我们应该是要先递归完,再来更新;
如果要先更新的话,那这个find函数对与sum[]的更新就没有作用;
嗯,就这么结束了;
PS. AC的代码是第二篇,第一篇有问题;
洛谷 P2342 叠积木 题解的更多相关文章
- 洛谷——P2342 叠积木
P2342 叠积木 题目大意: 给你一堆积木,排成一行,初始时每对积木都只有一个,支持两种操作 第一种是移动操作,格式为“移动X到Y的上面”.X和Y代表两块积木的编号,意思是将X所的那堆积 ...
- P2342 叠积木
P2342 叠积木 17通过 66提交 题目提供者wwqk4444 标签树状数组线段树USACO 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 暂时没有讨论 题目背景 Cube Stacki ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 洛谷P1577 切绳子题解
洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷 P1220 关路灯 题解
Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...
- 【洛谷P3410】拍照题解(最大权闭合子图总结)
题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...
随机推荐
- window.getComputedStyle()方法的使用及其扩展
1.window.getComputedStyle()方法返回值 是一个可以获取当前元素所有最终使用的CSS属性值.返回的是一个CSS样式声明对象([object CSSStyleDeclaratio ...
- Python类属性与实例属性理解
按理讲,类属性改变,类的实例对象这个属性也应该被改变,但是在python中实际却不是这样 class test(): name = 111 a = test() b = test() a.name = ...
- T-SQL, Part I: LIKE Pattern
The basic usage of LIKE pattern: %: it would be placed at the end and/or the beginning of a string. ...
- PHP 面试踩过的坑
1.get,post 的区别 **显示有区别 ** get方法是将字符串拼接在地址栏后面可以看见 而post方法看不见 **传递的大小有区别 ** 具体大小和浏览器有关系,ie浏览器是2k其他浏览器的 ...
- C语言|博客作业09
这个作业属于哪个课程 C语言程序设计II 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/10027 我在这个课程 ...
- Live CD
Live CD,又译为自生系统,是事先存储于某种可移动存储设备上,可不特定于计算机硬件(non-hardware-specific)而启动的操作系统(通常亦包括一些其他软件),不需安装至计算机的本地外 ...
- 3个例子详解C++ 11 中push_back 和 emplace_back差异
本文首发于个人博客https://kezunlin.me/post/b83bc460/,欢迎阅读最新内容! cpp11 push_back and emplace_back Guide case1 # ...
- 使用OpenMP加快OpenCV图像处理性能 | speed up opencv image processing with openmp
本文首发于个人博客https://kezunlin.me/post/7a6ba82e/,欢迎阅读! speed up opencv image processing with openmp Serie ...
- Ubuntu网络network eth0配置 | ubuntu network configuration
本文首发于个人博客https://kezunlin.me/post/5076bc45/,欢迎阅读! ubuntu network configuration Guide network proxy S ...
- Mybatis日志体系
承接上一篇关于spring 5.x的日志体系,本篇看看Mybatis的日志体系及实现,Mybatis版本基于3.x. 关于mybatis的官方文档比较友好,分门别类,各有论述,如mybatis官方文档 ...