码迷,mamicode.com
首页 > 其他好文 > 详细

JZOJ 1385. 直角三角形

时间:2019-08-07 22:53:54      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:三角形   Fix   答案   多少   一次函数   clear   需要   mes   swap   

题目

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];
 5 struct sb
 6 {
 7     long long x,y,xx;
 8 }tmp[10001];
 9 void turn(int p)
10 {
11     swap(tmp[p].x,tmp[p].y);
12     tmp[p].y=-tmp[p].y;
13     tmp[p].xx=(tmp[p].xx+1)%4;
14 }
15 bool cmp(sb a,sb b)
16 {
17     return a.x*b.y>b.x*a.y;
18 }
19 int cnt;
20 int main ()
21 {
22     int n;
23     cin>>n;
24     for (int i=1;i<=n;i++) cin>>x[i]>>y[i];
25     for (int i=1;i<=n;i++)
26     {
27         for (int j=1;j<=n;j++)
28         {
29             tmp[j].x=x[j]-x[i];
30             tmp[j].y=y[j]-y[i];
31             tmp[j].xx=0;
32             if (i==j)
33             {
34                 tmp[j].x=tmp[1].x;
35                 tmp[j].y=tmp[1].y;
36                 tmp[j].xx=tmp[1].xx;
37             }
38             else 
39               while (tmp[j].x<=0||tmp[j].y<0) turn(j);
40         }
41         sort(tmp+2,tmp+n+1,cmp);
42         int j=2;
43         while (j<=n)
44         {
45             int ans[4]={0};
46             int k=j;
47             while (k<=n&&tmp[j].x*tmp[k].y==tmp[k].x*tmp[j].y)
48                 ans[tmp[k].xx]++,k++;
49             for (int kk=0;kk<=3;kk++)
50               cnt+=ans[kk]*ans[(kk+1)%4];
51             j=k; 
52         }
53     }
54     cout<<cnt;
55 } 

 

JZOJ 1385. 直角三角形

标签:三角形   Fix   答案   多少   一次函数   clear   需要   mes   swap   

原文地址:https://www.cnblogs.com/zjzjzj/p/11318149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!