直角三角形

JZOJ 1385. 直角三角形

泄露秘密 提交于 2019-11-26 10:34:32
题目 Description   二维平面坐标系中有N个点。   从N个点选择3个点,问有多少选法使得这3个点形成直角三角形。 Input   第一行包含一个整数N(3<=N<=1500),表示点数。   接下来N行,每行包含两个用空格隔开的整数表示每个点的坐标,坐标值在-10^9到10^9之间。   每个点位置互不相同。 Output   输出直角三角形的数量。 Sample Input 输入1: 3 4 2 2 1 1 3 输入2: 4 5 0 2 6 8 6 5 7 输入3: 5 -1 1 -1 0 0 0 1 0 1 1 Sample Output 输出1: 1 输出2: 0 输出3: 7 Data Constraint 分析 首先,我们肯定要两两枚举 然后,我们需要知道斜率 在坐标系中 一次函数 y=kx k就是斜率 二次函数 y=kx+b k也是斜率 因为直角三角形两边斜率相乘是-1 根据这个性质我们可以知道构成三角形是斜率相等但在不同象限的点 所以我们就求斜率相同的点 然后我们就可以有一个排序来优化 相同的斜率的一定在一起 答案就是讲相邻两象限的相同斜率的点乘起来再相加 代码 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 long long x[10010],y[10001];