如何解决Codeforces Beta#12问题D?

时间:2010-10-05 18:09:21

标签: c++ algorithm

Click here to view the problem.

我无法找到比O(n ^ 2)更好的解决方案,但是如果n <= 500000,这将无效!

我的想法是按照(美丽+智力+丰富度)对它们进行排序,然后用它们之后的那些来测试它们。

请帮忙!

2 个答案:

答案 0 :(得分:1)

如果您将问题限制为两个属性(例如仅B_iR_i,仅用于说明目的),您可以将这些属性视为2D平面中的点。对于每个点(对应于Lady),您必须计算给定点的“半无限”矩形“正上方”的点数。

我认为比O(n^2)更快的解决方案会涉及range tree,尽管我没有考虑过细节。另见插图here

编辑:您可以存储(或在构建时更新)每个节点下面的点数与节点,以便您可以例如很容易得到低于或高于给定节点分裂点的点数。

答案 1 :(得分:1)

我认为你可以在O(n log n)中通过将每个女士视为3空间中的点并计算点的凸包来解决这个问题(例如,参见here)。然后,船体内的任何一点都是潜在的自杀案件。