Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
注意不要散列出负数就OK#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; struct node { int value; int next; }remain[2000]; int hashtable[1013]; int remaincnt; inline int trans(int x, int y) { return (x+20000)*40001 + y + 20000; } inline int hash(int v) { return v%1013; } bool find(int v) { int key = hash(v); if(hashtable[key] == -1) return false; key = hashtable[key]; while(key != -1 && remain[key].value != v) key = remain[key].next; if(key == -1) return false; else return true; } void add(int v) { int key = hash(v); remain[remaincnt].value = v; remain[remaincnt].next = hashtable[key]; hashtable[key] = remaincnt++; } int x[1003], y[1003]; int main() { int n, cnt; int x2, y2, x4, y4; while(scanf("%d", &n)!=EOF) { if(n == 0) break; memset(hashtable, -1, sizeof(hashtable)); remaincnt = 0; cnt = 0; for(int i =0; i<n; i++) { scanf("%d %d",&x[i], &y[i]); add(trans(x[i], y[i])); } for(int i =0; i<n-1; i++) for(int j = i+1; j<n; j++) { x2 = (x[i]+x[j]+y[j]-y[i]); y2 = (y[i]+y[j]+x[i]-x[j]); if((x2&y2)&0x1) continue; x2>>=1; y2>>=1; if(!find(trans(x2, y2))) continue; x4 = (x[i]+x[j]-y[j]+y[i]); y4 = (y[i]+y[j]-x[i]+x[j]); if((x4&y4)&0x1) continue; x4>>=1; y4>>=1; if(find(trans(x4, y4))) cnt++; } printf("%d\n", cnt/2); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator