C++ 我如何解决Codeforces测试版第12轮的问题D?

C++ 我如何解决Codeforces测试版第12轮的问题D?,c++,algorithm,C++,Algorithm,我找不到比O(n^2)更好的解决方案,但如果使用n将问题限制为两个属性(例如仅B_I和R_I,仅用于说明目的),则可以将这些属性视为二维平面中的点。对于每个点(对应于一位女士),您必须计算给定点右侧和上方(半无限)矩形中的点数 我认为一个比O(n^2)更快的解决方案将涉及到a,尽管我没有考虑细节。另请参见图示 编辑:您可以存储(或在构建时更新)每个节点与该节点“下方”的点数,以便您可以轻松获得给定节点拆分点下方或上方的点数。我认为您可以在O(n log n)中解决此问题通过将每个女士视为3-空间

我找不到比O(n^2)更好的解决方案,但如果使用n将问题限制为两个属性(例如仅
B_I
R_I
,仅用于说明目的),则可以将这些属性视为二维平面中的点。对于每个点(对应于一位女士),您必须计算给定点右侧和上方(半无限)矩形中的点数

我认为一个比
O(n^2)
更快的解决方案将涉及到a,尽管我没有考虑细节。另请参见图示


编辑:您可以存储(或在构建时更新)每个节点与该节点“下方”的点数,以便您可以轻松获得给定节点拆分点下方或上方的点数。

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

我删除了我的帖子,因为我意识到这种方法不会真正起作用。很抱歉让你困惑,如果我有一些我确信有效的东西,我会对此进行更多的思考并重新发布。三个属性不是很适合一个立方体吗?我看到O(n^3)基于您使用立方体提出的解决方案。如果你在数据中添加第一次遍历,我认为你可以获得“半无限”的边界。
n
是点数,因此总共有
3n
坐标值。“规范”解决方案是将所有
n
点的三个坐标与所有其他
n-1
点的坐标进行比较,总共需要
3*n*(n-1)/2=O(n^2)
比较。根据维基百科的文章,范围树的查询时间是
O(log^d(n)+k)
其中
k
是检索到的点数。我认为人们可以摆脱
+k
,因为人们不想知道所讨论的点的所有坐标,只想知道它们的数量(这是可以存储在树节点中的)。Brian:
半无限
这个词可能有误导性,你是对的,事实上,因为点的数量是有限的,所有点都可以放在一个立方体中。感谢您的澄清。这是一个有趣的问题。当然,我忍不住觉得可能有一个更简单的方法!不幸的是,我认为这很好。。。但是错了!睡过觉之后,我想出了以下反例:(9,0,0),(0,9,0),(0,0,9),(1,1,1)。前三个点加上原点定义了凸面外壳,第四个点位于内部,但alas没有定义自杀案例。老鼠,我用的是alg。并且得到了WA