【蘭橋杯2023 B国】カウンティングトライアングル
【問題の説明】
Xiao Ming はnn を2 次元座標系に配置しましたn点の場合、三角形を形成できる 3 つの点を含むサブセットを選択したいと考えています。しかし、そのような解決策は非常にたくさんあったため、彼は二等辺三角形を形成できるものだけを選択することにしました。二等辺三角形を形成するための選択肢がいくつあるか計算するのを手伝ってください。
【入力フォーマット】
n + 1 n + 1の合計を入力してくださいn+1行。
最初の行は正の整数nnn。n
の後ろn行、各行には 2 つの整数xi、yi x_i、y_iバツ私は、y私はii代目を代表するi点の座標。
[出力フォーマット]
出力合計1 11行、整数。
【入力例】
5
1 4
1 0
2 1
1 2
0 1
【出力例】
5
[サンプル概要]
全部で5 5あります5 つの選択肢:{ 2 , 3 , 4 } \{2,3,4\}{ 2 、3 、4 }、{ 3 , 4 , 5 } \{3,4,5\}{ 3 、4 、5 }、{ 4 , 5 , 2 } \{4,5,2\}{ 4 、5 、2 }、{ 5 , 2 , 3 } \{5,2,3\}{ 5 、2 、3 }、{ 1 , 3 , 5 } \{1,3,5\}{ 1 、3 、5 }。
評価ユースケースの規模と規約
- 20% 20\%の場合データの20%はn ≤ 200 n \le 200n≤200。
- 100 %の場合100\%100%データ、保証n ≤ 2000 n \le 2000n≤2000,0 ≤ xi , yi ≤ 1 0 9 0 \le x_i, y_i \le 10^90≤バツ私は、y私は≤1 09。
#include<bits/stdc++.h>
using namespace std;
int x[2010],y[2010];
double dis(int a,int b)
{
return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}
bool check(double a,double b)
{
if(fabs(a-b)<1e-6) return true;
else return false;
}
int main()
{
int n;cin>>n;
for(int i=1; i<=n; i++) cin>>x[i]>>y[i];
int ans=0;
for(int i=1; i<=n; i++)
for(int j=1; j<i; j++)
for(int k=1; k<j; k++)
{
double a=dis(i,j),b=dis(i,k),c=dis(k,j);
if(a+b>c && a+c>b && b+c>a)
if(check(a,b) || check(a,c) || check(b,c))
ans++;
}
cout<<ans;
return 0;
}