洛谷 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也不会得到钱. 注意:带下属不是白带的 ...
随机推荐
- 数据结构--树链剖分准备之LCA
有关LCA的模板题 传送门 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和 ...
- SD-WAN 本地策略与中心策略配置(三)
目录 1. Localized Policy配置 2. Centralized Policy配置 3. Application Route and Traffice Policy 1. Localiz ...
- 本地存储localstorage
小小插件,封装了一个存取删 <script type="text/javascript"> /* *getItem(name) * *setItem(name,valu ...
- 手把手教你实现热更新功能,带你了解 Arthas 热更新背后的原理
文章来源:https://studyidea.cn/java-hotswap 一.前言 一天下午正在摸鱼的时候,测试小姐姐走了过来求助,说是需要改动测试环境 mock 应用.但是这个应用一时半会又找不 ...
- ASP.NET Core 1.0: 指定Default Page
前不久写过一篇Blog<指定Static File中的文件作为Default Page>,详细参见链接. 然而,今天偶然发现了一个更加简洁的方法,直接使用Response的Redirect ...
- MySQL 1364 错误提示:#1364 - Field "details" doesn't have a default value
原因:mysql字段设计的时候为not null,结果此字段没有插入值,解决方法: 运行以下命令. SET @@GLOBAL.sql_mode="NO_AUTO_CREATE_USER,NO ...
- Javascript脚本语言
找组件用 id (唯一) 2.name 样式 使用分类 1 页面中 2 建JS文件 可以放在head也可以在body 工作区可以有 1 全局变量 2 由多个函数构成 标签编辑器 onChange 改变 ...
- C#泛型自己的理解和总结
万事开头难,今天先从随笔开始,记录工作中平时不太注意到的知识点.今天开始说下泛型. 泛型在我们项目中很是常见,使用很广泛,我觉的它有以下几个优点. 1.安全性. 2.性能. 3.二进制代码的重用. 4 ...
- Oracle10g安装步骤(二)
接上篇:
- Django--导出项目依赖库requirements.txt
虚拟环境下: 1.导出项目依赖库: pip freeze > requirements.txt 2.使用 pip 一次性安装项目的所有依赖项,方法是在命令行中输入: pip install - ...