本蒟蒻又来发题解了

这题是不是有点像并查集,但是那个询问的个数是不是有点骚;

所以,普通的并查集是无法解决这个问题的,这个时候就需要用到带权并查集了;

每次跑的时候都记录下它的下面有几个点,然后询问的时候的复杂度是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 叠积木 题解的更多相关文章

  1. 洛谷——P2342 叠积木

    P2342 叠积木   题目大意:   给你一堆积木,排成一行,初始时每对积木都只有一个,支持两种操作  第一种是移动操作,格式为“移动X到Y的上面”.X和Y代表两块积木的编号,意思是将X所的那堆积 ...

  2. P2342 叠积木

    P2342 叠积木 17通过 66提交 题目提供者wwqk4444 标签树状数组线段树USACO 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 暂时没有讨论 题目背景 Cube Stacki ...

  3. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  4. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  5. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  6. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  7. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  8. 洛谷 P1220 关路灯 题解

    Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...

  9. 【洛谷P3410】拍照题解(最大权闭合子图总结)

    题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...

随机推荐

  1. 大数据之路day05_1--初识类、对象

    1.1 什么是面向对象        面向对象思想就是不断的创建对象(属性与行为的封装,让二者作为整体参与程序执行),使用对象,指挥对象做事情.(在已有对象的情况下,直接使用对象,而不再去考虑对象的内 ...

  2. php自定义截取中文字符串-utf8版

    php自定义截取中文字符串-utf8版 UTF-8的编码范围(utf-8使用1-6个字节编码字符,实际上只使用了1-4字节): 1个字节:00——7F 2个字节:C080——DFBF 3个字符:E08 ...

  3. Linux下mysql的主从复制配置

    1.准备两台数据库环境,或者单台多实例环境,能正常启动和登录. 数据库的安装和多实例配置请参考https://www.cnblogs.com/qiuhom-1874/p/9757061.html. 2 ...

  4. Windows键盘无法调起

    Windows 键盘无法调起 经常使用触摸屏幕的小伙伴肯定都遇到过屏幕键盘怎么也唤不起来(在桌面模式下,非平板模式).以下收集了一些常见的解决方案: 注:本文基于 Windows 10 v1903,其 ...

  5. mysql导入sql出错,无脑解决办法

    找到my.cnf文件在[mysqld]的下面添加 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTI ...

  6. iOS定位--CoreLocation

    一:导入框架 #import <CoreLocation/CoreLocation.h> 二:设置代理及属性 <CLLocationManagerDelegate> @prop ...

  7. ASP.NET Core 1.0: Using Entity Framework Core

    伴随着ASP.NET Core 1.0发布的还有Entity Framework Core 1.0; 官方文档链接:https://docs.efproject.net/en/latest/platf ...

  8. 019.Kubernetes二进制部署插件dashboard

    一 修改配置文件 1.1 下载解压 [root@k8smaster01 ~]# cd /opt/k8s/work/kubernetes/ [root@k8smaster01 kubernetes]# ...

  9. Matlab 文件格式化/Matlab Source File Formator

    由于需要使用到别人编写的Matlab代码文件,但是呢不同的人有不同的风格,有的写得就比较糟糕了. 为了更好地理解代码的内容,一个比较美观的代码会让人身心愉悦. 但是在网上并没有找到一个比较好的实现,此 ...

  10. 公众号第三方平台开发 component_verify_ticket和accessToken的获取

    公众号第三方平台审核通过之后,微信的服务器会定时(10分钟一次)给"授权事件接收URL"发送component_verify_ticket,这里我们需要及时更新component_ ...