#include <iostream>
#include <algorithm>
using namespace std;
//思路:
//枚举两个端点,,二分中点
//网上貌似还有检测的方法,挺简单的
struct point{
int x, y;
point(){}
point(int i, int j) :x(i), y(j){}
bool operator<(const point& op)const{
if (x == op.x)return y < op.y;
return x < op.x;
}
bool operator==(const point& op)const{
return (op.x == x&&op.y == y);
}
};
point a[3001];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)cin >> a[i].x >> a[i].y;
sort(a + 1, a + 1 + n);
int ans = 0;
for (int i = 1; i < n; i++){
for (int j = i + 1; j <= n; j++){
point A = a[i], B = a[j];
point mix((A.x + B.x) / 2, (A.y + B.y) / 2);
//若中点的坐标为整数, 则二分该中点
if (2 * mix.x == A.x + B.x && 2 * mix.y == A.y + B.y){
int low = 1, high = n;
while (low + 1 < high){
int mid = (low + high) / 2;
if (a[mid] < mix)low = mid + 1;
else high = mid;
}
if (a[high] == mix || a[low] == mix)ans++;
}
}
}
cout << ans << endl;
return 0;
}
CodeForces 181B Number of Triplets(二分)
最新推荐文章于 2017-03-04 09:55:21 发布