P2024 [NOI2001] 食物链 题解
题目描述
动物王国中有三类动物 ,这三类动物的食物链构成了有趣的环形。 吃 , 吃 , 吃 。
现有 个动物,以 编号。每个动物都是 中的一种,但是我们并不知道它到底是哪一种。
有人用两种说法对这 个动物所构成的食物链关系进行描述:
- 第一种说法是
1 X Y,表示 和 是同类。 - 第二种说法是
2 X Y,表示 吃 。
此人对 个动物,用上述两种说法,一句接一句地说出 句话,这 句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。
- 当前的话与前面的某些真的话冲突,就是假话;
- 当前的话中 或 比 大,就是假话;
- 当前的话表示 吃 ,就是假话。
你的任务是根据给定的 和 句话,输出假话的总数。
思路
这道题显然是并查集,那么我们需要考虑的是如何在并查集中把同类/不同类表示出来。如果我们将同类的合并到一个并查集里,不同类的不在同一个并查集,那么我们就无法记录不同类之间的关系。如果将不同类合并到一个并查集中,同类的也合并到一个并查集中,其中在并查集里它们有一定的次序,就可以解决以上问题了。
具体过程
当指令给出 吃 时,我们就把 指向 。不难发现,如果这些关系形成了一棵树或一条链,也就是从下到上下面的吃上面的,就会构成一个循环:每差三个就是一个同类。
当给出两者是同类的关系时,说明我们需要将两者合并到一个并查集中。但是不能乱合并,我们也需要体现出其中的层次关系。只需要让这两个同类合并后深度差三即可。所以找到合适的位置再合并就行了。
附:圆锥、球体体积推导
圆锥
一个圆锥可以看作是一个直角三角形绕直角边旋转一周的结果。同样的,我们如果用柱体的眼光看待,它就是大小渐变的圆堆积而成的物体。这么一来,我们就可以使用积分求出它的体积了。
如图,我们可以把圆锥进行“切片”操作。

对于每一个圆的半径,我们可以用相似三角形求解。

如图,我们假定圆锥的高度为 ,底面半径为 ,那么对于一个到顶点距离为 的圆,它的半径 就是 。对于 ,我们将这些面积进行积分。
对于每一个圆的面积:
要求:
而:
故最终的答案为:
球体
我们把上面的思路变换一下,将球体切片成大小不一的圆形。对于到圆心距离为 的圆的面积可以表示为:
积分一下:
求得体积:
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
无穷大?