POJ 2002
纯二分 水
#include <cstdio> #include <cstring> #include <algorithm> using std::memset; using std::sort; const int MAX = 2005; int n; struct position { int x,y; }star[MAX];; bool cmp(position a,position b) { if(a.x == b.x) return a.y < b.y; return a.x < b.x; } int cmp2(position a, position b) { if(a.x == b.x) { if(a.y == b.y) return 0; else if(a.y < b.y) return -1; else return 1; } else if(a.x < b.x) return -1; return 1; } bool binsearch(int l, int r, position x) { while(l+1 < r) { int m = (l+r)>>1; if(cmp2(x, star[m]) == 0) return true; else if(cmp2(x, star[m]) == -1) r = m; else l = m; } return false; } int main() { while(scanf("%d", &n) && n) { for(int i = 0 ; i < n; i++) { scanf("%d%d", &star[i].x, &star[i].y); } sort(star, star+n, cmp); //for(int i = 0 ; i < n; i++) //{ // printf("%d%d\n", star[i].x, star[i].y); //} int count = 0; for(int i = 0 ; i < n; i++) { for(int j = i+1; j < n; j++) { int dx = star[j].x - star[i].x; int dy = star[j].y - star[i].y; position temp; temp.x = star[i].x + dy; temp.y = star[i].y - dx; if(binsearch(-1, n, temp) == false) continue; temp.x = star[j].x + dy; temp.y = star[j].y - dx; if(binsearch(-1, n, temp) == false) continue; count++; } } printf("%d\n", count/2); } }