洛谷 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的代码是第二篇,第一篇有问题;
转载于:https://www.cnblogs.com/Flash-plus/p/11210692.html
洛谷 P2342 叠积木 题解相关推荐
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 洛谷P1273 有线电视网 题解
洛谷P1273 有线电视网 题解 题目链接:P1273 有线电视网 题意: 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为 ...
- 洛谷P4568 [JLOI2011] 飞行路线 题解
洛谷P4568 [JLOI2011] 飞行路线 题解 题目链接:P4568 [JLOI2011] 飞行路线 题意: Alice 和 Bob 现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公 ...
- 洛谷P3426 [POI2005]SZA-Template 题解
洛谷P3426 [POI2005]SZA-Template 题解 题目链接:P3426 [POI2005]SZA-Template 题意:你打算在纸上印一串字母. 为了完成这项工作,你决定刻一个印章. ...
- 洛谷P1156 垃圾陷阱 题解浅谈刷表法与填表法
洛谷P1156 垃圾陷阱 题解&浅谈刷表法与填表法 填表法 :就是一般的动态规划,当前点的状态,可以直接用状态方程,根据之前点的状态推导出来. 刷表法:由当前点的状态,更新其他点的状态.需要注 ...
- 洛谷P1262 间谍网络题解
洛谷P1262 间谍网络题解 题目大意 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果 A 间谍手中掌握着关于 B 间谍的犯罪证据,则称 A 可以揭发 B.有些间谍收受贿赂,只要 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- 洛谷P4099 [HEOI2013]SAO 题解
洛谷P4099 [HEOI2013]SAO 题解 题目链接:P4099 [HEOI2013]SAO 题意: Welcome to SAO ( Strange and Abnormal Online). ...
- 洛谷 P2704 炮兵阵地 题解
洛谷 P2704 炮兵阵地 题解 洛谷 P2704 题目 司令部的将军们打算在NNNMMM的网格地图上部署他们的炮兵部队.一个NNNMMM的地图由NNN行MMM列组成,地图的每一格可能是山地(用&qu ...
最新文章
- Java数组传参sql_Java中如何传一个数组作为筛选条件操作数据库(sql中foreach的使用)...
- postgresql中自定义函数脚本的备份及恢复
- Java spark中的各种范型接口Function的区别(持续更新中)
- bootcmd和bootargs
- 小米10S继承“祖传”三重快充:50W有线+30W无线+10W反充
- 95-140-122-源码-transform-算子reduce
- 用matlab读取raw并做出图像,image - 如何在MATLAB中读取RAW图像? - 堆栈内存溢出
- Linux文件导出到Windows乱码的问题
- 爬虫之scrapy环境安装
- 最新html word 分页符,分页符在哪 或者打开 word文档选项
- 国美易卡管理云平台,国美易卡采用大量另类数据
- Photoshop照片一键转换手绘效果图动作
- 唯物辩证法-马克思主义辩证法
- border渐变 ios_iOS一个方法搞定view渐变色
- outlook收件延迟严重_你(严重)对我不了解的五件事
- UserWarning: mkl-service package failed to import, therefore Intel(R) MKL in
- 每日诗词 【登徒子好色赋并序】
- 好用的鼠标连点软件,鼠标录制播放软件
- NC17889 	 新建 Microsoft Office Word 文档
- JAVA中的时间大小比较
热门文章
- Linux(九、十)文件权限及网络配置管理
- Excel 输入内容自动生成条形码
- C语言 --- sizeof() 7种使用详解
- WebRTC APM
- 20190519 ICPC西安邀请赛游记
- 获取QQ音乐排行榜数据
- Cypress Locators
- 自动合并两个.bib 去除.bib中的重复条目
- QQ浏览器 不支持html5,浏览器常见问题_浏览器高级功能_浏览器在线帮助-QQ浏览器官网...
- 台式计算机输入设备,简述常用的输入设备和输出设备有哪些 – 手机爱问