POJ 1971 Parallelogram Counting (Hash)
来源:互联网 发布:php新闻发布系统源码 编辑:程序博客网 时间:2024/04/30 01:58
Parallelogram Counting
Time Limit: 5000MS Memory Limit: 65536KTotal Submissions: 5625 Accepted: 1890
Description
There are n distinct points in the plane, given by their integer coordinates. Find the number of parallelograms whose vertices lie on these points. In other words, find the number of 4-element subsets of these points that can be written as {A, B, C, D} such that AB || CD, and BC || AD. No four points are in a straight line.
Input
The first line of the input contains a single integer t (1 <= t <= 10), the number of test cases. It is followed by the input data for each test case.
The first line of each test case contains an integer n (1 <= n <= 1000). Each of the next n lines, contains 2 space-separated integers x and y (the coordinates of a point) with magnitude (absolute value) of no more than 1000000000.
The first line of each test case contains an integer n (1 <= n <= 1000). Each of the next n lines, contains 2 space-separated integers x and y (the coordinates of a point) with magnitude (absolute value) of no more than 1000000000.
Output
Output should contain t lines.
Line i contains an integer showing the number of the parallelograms as described above for test case i.
Line i contains an integer showing the number of the parallelograms as described above for test case i.
Sample Input
260 02 04 01 13 15 17-2 -18 95 71 14 82 09 8
Sample Output
56
Source
Tehran Sharif 2004 Preliminary
枚举所有对角线,对中点进行Hash即可。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 1005#define mod 1000007int x[N],y[N];struct point{ int x,y,cnt;};struct hashtable{ int h[mod],p[mod],size; point s[mod]; int hash(int x,int y) { return ((x*131+y+mod)&0x7FFFFFFF)%mod; } void insert(int x,int y) { int i,id=hash(x,y); for(i=h[id]; ~i; i=p[i]) if(s[i].x==x&&s[i].y==y) { s[i].cnt++; return; } s[size].cnt=1; s[size].x=x,s[size].y=y; p[size]=h[id],h[id]=size++; } int find(int x,int y) { int i,id=hash(x,y); for(i=h[id]; ~i; i=p[i]) if(s[i].x==x&&s[i].y==y) return i; return 0; } void clear() { size=1; memset(h,-1,sizeof(h)); }} ht;int main(){ int t,n; scanf("%d",&t); while(t--) { ht.clear(); scanf("%d",&n); for(int i=0; i<n; ++i) scanf("%d%d",x+i,y+i); for(int i=0; i<n; ++i) for(int j=i+1; j<n; ++j) ht.insert(x[i]+x[j],y[i]+y[j]); int ans=0; for(int i=0; i<mod; ++i) for(int j=ht.h[i]; ~j; j=ht.p[j]) { int tmp=ht.s[j].cnt; ans+=((tmp-1)*tmp)/2; } printf("%d\n",ans); } return 0;}
- POJ 1971 Parallelogram Counting (Hash)
- POJ 1971 Parallelogram Counting(hash)
- POJ 1971 Parallelogram Counting(枚举+HASH)
- Parallelogram Counting(POJ 1971)
- poj 1971 Parallelogram Counting
- POJ 1971 Parallelogram Counting
- POJ 1971 Parallelogram Counting
- poj 1971 Parallelogram Counting
- POJ 1971 Parallelogram Counting
- poj 1971 Parallelogram Counting
- POJ 1971 Parallelogram Counting
- pku 1971 Parallelogram Counting(hash)
- poj 1971 Parallelogram Counting(数学题)
- POJ 1971 Parallelogram Counting【平面几何】
- POJ-----1971Parallelogram Counting数学题
- POJ 1971 Parallelogram Counting 笔记
- POJ1971 Parallelogram Counting(hash)
- poj Parallelogram Counting 1971 (哈希表) 好题
- 如何实现单一用户单一机子登录
- VC++系统各种路径信息的获取
- 话说程序员的职业生涯
- 软件开发模式对比(瀑布、迭代、螺旋、敏捷)
- sourceInsight使用
- POJ 1971 Parallelogram Counting (Hash)
- jquery的事件总结实用篇(持续更新)
- java 创建 xml文件
- Log4j 程序中动态创建多个logger 生成不同的日志文件
- cmd开放端口
- C++ 函数模板特化导致的多重定义链接错误
- 当在navigationBar的右侧添加按钮时有空隙,除掉间隔
- AndroidManifest.xml 的属性
- CListCtrl使用详解