给定第一象限的坐标列表,计算可以形成多少个边平行于 x 轴的直角三角形

Posted

技术标签:

【中文标题】给定第一象限的坐标列表,计算可以形成多少个边平行于 x 轴的直角三角形【英文标题】:Given a list of coordinates in the first quadrant, calculate how many right triangles can be formed which have one side parallel to x-axis 【发布时间】:2011-01-23 09:52:51 【问题描述】:

给定first quadrant 中的坐标列表,计算可以从这些坐标中形成多少个直角三角形,这些三角形的一侧平行于x-axis,一侧平行于y-axis

最近我参加了一个编程竞赛,更具体地说是 INOI(Indian National Olympiad n Informatics),这是论文中两个问题中的第一个。

基本上我认为(a,y)(x,y)(x,b)类型的任何3个点都会形成这样一个三角形但无法更好地管理任何东西,最后只是写了一个天真的O(n^3) 解决方案(我所有的朋友也是如此)。

谁能提出更好的方法?

拜托,这不是家庭作业。

【问题讨论】:

你最多可以得到多少分? 10^4 我认为 1s 是时间限制。记不清是 >10^4 还是 10^4 【参考方案1】:

numX[i] = how many points have i as their X coordinatenumY[i] = how many points have i as their Y coordinate

我们将计算某个点p 存在多少具有所需属性的三角形。不失一般性,我们可以假设p 是三角形形成直角的点。

为此,我们需要一个具有相同Y 坐标的点和一个具有相同X 坐标的点。那么这个算法怎么样:

compute numX and numY in O(n).
num = 0
for each point p in the given list of points
    num += (numX[p.X] - 1)*(numY[p.Y] - 1)

output num

基本上,我们可以将具有相同X 坐标的每个点与具有相同Y 坐标的每个点组合起来以获得所需的三角形。我们减去1,以免算上p本身。

这将在O(n) 中运行。

【讨论】:

【参考方案2】:

是的,我同意 IVlad 的观点。 输入可以直接存储在一个 2*N 数组中,同时每个 x 和 y 的计数应该存储在 numX 和 numY 中......然后就是 wat IVlad 说的......

【讨论】:

以上是关于给定第一象限的坐标列表,计算可以形成多少个边平行于 x 轴的直角三角形的主要内容,如果未能解决你的问题,请参考以下文章

二、OpenGL坐标系

如何计算哪个象限属于(坐标)纬度和纬度点

方格计数

bzoj 1824: [JSOI2010]下棋问题

简单的模拟

1.9.14