专栏文章

题解:AT_abc418_e [ABC418E] Trapezium

AT_abc418_e题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio8yb93
此快照首次捕获于
2025/12/02 15:18
3 个月前
此快照最后确认于
2025/12/02 15:18
3 个月前
查看原文

题意

给你一些不共线的点,求他们能组成多少梯形。
这里的梯形是包括平行四边形的。

题解

直接枚举四个点会炸。我们考虑梯形的一对边是平行的,所以我们可以把所有平行的边归类。
题目保证没有三个点共线,所以我们直接计算每种边有多少条就可以了,每种的方案是 k(k1)2\frac{k(k - 1)}{2}
然后你发现自己连第一个样例都过不去。问题在于,如果存在一个平行四边形,那么他会被横着竖着算两次,因此我们还需要计算所有的平行四边形的数量。这个其实和梯形是一样的,只不过我们需要把所有既平行又相等的边归为一类,统计所有的平行四边形数量。但是这样依然存在计算两次的问题,所以我们把得到的答案再减半就是平行四边形的数量了。
实现上可以用 unordered_map,但是斜率如果直接用浮点数的话会炸。这里提供两种方法:
  1. 使用 unordered_map 的自定义比较功能,判断两个斜率的差的绝对值。代码
  2. 使用有理数表示斜率,然后自定义哈希。代码
实现起来,第一种比较简单,常数较小;第二种比较保险(当然前提是你的哈希写的比较好,没有碰撞的风险。),常数略大。

评论

0 条评论,欢迎与作者交流。

正在加载评论...