POJ 1791 Parallelogram Counting(求平行四边形数量)

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

Input starts with an integer T (≤ 15), denoting the number of test cases.

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

For each case, print the case number and the number of parallelograms that can be formed.

Sample Input

2

6

0 0

2 0

4 0

1 1

3 1

5 1

7

-2 -1

8 9

5 7

1 1

4 8

2 0

9 8

Sample Output

Case 1: 5

Case 2: 6

给出点的坐标求出能连成平行四边形的数量。

思路:

  用结构体记录每两个点的x坐标和与y坐标和( 相当于记录这两个点为对角线的情况 )然后循环判断多少个对角线的被交点平分(结构体中x,y的值相等)求出对角线的数量,然后C(sum,2)。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int x[1010],y[1010];
 5 struct stu
 6 {
 7     int x,y;
 8 }st[1010*1010/2];
 9 bool cmp(stu a,stu b)
10 {
11     if(a.x != b.x)
12         return a.x < b.x;
13     else
14         return a.y < b.y;
15 }
16 int main()
17 {
18     int t,ss=0;
19     scanf("%d",&t);
20     while(t--)
21     {
22         int n,i,j;
23         scanf("%d",&n);
24         for(i = 0 ; i < n ; i++)
25         {
26             scanf("%d %d",&x[i],&y[i]);
27         }
28         int k=0;
29         for(i = 0 ; i < n ; i++)
30         {
31             for(j = i+1 ; j < n ; j++)
32             {
33                 st[k].x=x[i]+x[j];
34                 st[k++].y=y[i]+y[j];
35             }
36         }
37         sort(st,st+k,cmp);
38         int num=0,sum=1,ans=0;
39         for(i = 1 ; i < k ; i++)
40         {
41             if(st[num].x == st[i].x && st[num].y == st[i].y)
42                 sum++;                            //sum代表线的数量
43             else
44             {
45                 ans+=(sum*(sum-1)/2);            //这里是C(sum,2)
46                 num=i;
47                 sum=1;
48
49             }
50         }
51         printf("Case %d: %d\n",++ss,ans);
52     }
53 }
时间: 2024-12-27 15:46:36

POJ 1791 Parallelogram Counting(求平行四边形数量)的相关文章

【POJ】Parallelogram Counting(HASH,数学之平行四边形)

Parallelogram Counting 题意:输入t表示有t组数据 每组数据输入一个数n,表示有n个点 然后有n行,每行是这个点的(x,y) 问这些点能组成多少个平行四边形 思路:求中点,中点一样的是一个平行四边形. 记录同一个中点的个数sum(初始为1),平行四边形数是(sum-1) * sum / 2; #include<iostream> #include<algorithm> using namespace std; typedef long long ll; con

Parallelogram Counting(平行四边形个数,思维转化)

1058 - Parallelogram Counting    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB There are n distinct points in the plane, given by their integer coordinates. Find the number of parallelograms whose vertices lie on these po

poj 1144 (Tarjan求割点数量)

题目链接:http://poj.org/problem?id=1144 描述 一个电话线公司(简称TLC)正在建立一个新的电话线缆网络.他们连接了若干个地点分别从1到N编号.没有两个地点有相同的号码.这些线是双向的并且能使两个地点保持通讯.每个地点的线都终结于电话交换机.每个地点都有一个电话交换机.从每个地点都能通过线缆到达其他任意的地点,然而它并不需要直接连接,它可以通过若干个交换机来到达目的地.有时候某个地点供电出问题时,交换机就会停止工作.TLC的工作人员意识到,除非这个地点是不可达的,否

POJ 1971 Parallelogram Counting

题目链接: http://poj.org/problem?id=1971 题意: 二维空间给n个任意三点不共线的坐标,问这些点能够组成多少个不同的平行四边形. 题解: 使用的平行四边形的判断条件:对角线互相平分的四边形是平行四边形. 所以我们枚举每一条线段,如果有两条线段的中点是重合的,那么这四个顶点就能构成一个平行四边形,我们也就是说每条线段我们只要维护中点就可以了. 1.map维护中点:(数据比较大,t了) 1 #include<iostream> 2 #include<cstdio

计算几何 + 统计 --- Parallelogram Counting

Parallelogram Counting Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5749   Accepted: 1934 Description There are n distinct points in the plane, given by their integer coordinates. Find the number of parallelograms whose vertices lie o

POJ 2282 The Counting Problem,组合数学

POJ 2282 The Counting Problem,组合数学 ACM 题目地址:POJ 2282 题意: 给出俩数n,m,求从n~m中0~9分别出现的次数. 分析: 组合数学. 只要能快速算出0~n中各个数的出现次数就能解决问题了. 要把数拆开来看,比如3456=3000+400+50+6. 然后就只要考虑后面都是0的数就行了. 0~3000中,我们要分为两部分来考虑: 在第一位中,0\1\2都出现了1000次. 假设不管第一位,后面那些位数出现0~9的几率是均等的(先不考虑前导0).那

POJ1144 Network 题解 点双连通分量(求割点数量)

题目链接:http://poj.org/problem?id=1144 题目大意:给以一个无向图,求割点数量. 这道题目的输入和我们一般见到的不太一样. 它首先输入 \(N\)(\(\lt 100\))表示点的数量(\(N=0\)表示文件输入结束). 然后接下来每行输入一组数字. 如果这一组数字只包含一个 \(0\) ,说明本组测试数据输入结束: 否则,假设这些数可以拆分成 \(a_1,a_2,a_3, \cdots ,a_m\),则说明 \(a_1\) 这个点到 \(a_2,a_3, \cdo

POJ 2386 Lake Counting 搜索题解

简单的深度搜索就可以了,看见有人说什么使用并查集,那简直是大算法小用了. 因为可以深搜而不用回溯,故此效率就是O(N*M)了. 技巧就是增加一个标志P,每次搜索到池塘,即有W字母,那么就认为搜索到一个池塘了,P值为真. 搜索过的池塘不要重复搜索,故此,每次走过的池塘都改成其他字母,如'@',或者'#',随便一个都可以. 然后8个方向搜索. #include <stdio.h> #include <vector> #include <string.h> #include

TOJ-1313 Parallelogram Counting

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,