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 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 integersx 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

Output for 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


Case 1: 5

Case 2: 6

题解:

给一系列点,让找到可以组成的平行四边形的个数;

思路:由于平行四边形的交点是唯一的,那么我们只要记录每两个直线的交点,判断交点重复的个数可以求出来了;假设有这个交点有三个重复的,则ans+=3*2/2;

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long LL;
const int MAXN=1010;
struct Dot{
    double x,y;
    bool operator < (const Dot &b) const{
        if(x!=b.x)return x<b.x;
        else return y<b.y;
    }
};
Dot dt[MAXN];
Dot num[MAXN*MAXN];
int main(){
    int T,N,kase=0;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&N);
        for(int i=0;i<N;i++)scanf("%lf%lf",&dt[i].x,&dt[i].y);
        int tp=0;
        for(int i=0;i<N;i++)
            for(int j=i+1;j<N;j++){
                if(dt[i].x==dt[j].x&&dt[i].y==dt[j].y)continue;
                num[tp].y=(dt[i].y+dt[j].y)/2;
                num[tp].x=(dt[i].x+dt[j].x)/2;
                tp++;
            }
            sort(num,num+tp);
            LL ans=0,cur=1;
        for(int i=1;i<tp;i++){
            if(num[i].x==num[i-1].x&&num[i].y==num[i-1].y)cur++;
            else{
                ans+=cur*(cur-1)/2;cur=1;
            }
        }
        printf("Case %d: %lld\n",++kase,ans);
    }
    return 0;
}
时间: 2024-10-29 19:05:38

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

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 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 a

Codeforces 911D. Inversion Counting (数学、思维)

题目链接:Inversion Counting 题意: 定义数列{ai|i=1,2,...,n}的逆序对如下:对于所有的1≤j<i≤n,若ai<aj,则<i,j>为一个逆序对.于是,对于一个数列a[1..n],给定m次操作.对于每一次操作,给定l,r(1≤l<r≤n),将序列a[l..r]倒置.求倒置后的逆序对的数量的奇偶性. 题解: 假设现在我们有一个序列并翻转这个序列[l,r]区间里面的数.假设某个数的k值是指在这个值后面小于这个数的数的个数,其实我们可以发现对于[1,l

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,

HDU 4343 多查询求区间内的最大不相交区间个数-思维&amp;贪心-卡时间&amp;二分&amp;剪枝

题意:给你一些区间,现在有m个查询,求出每个查询的区间内的最大的不相交区间个数 分析: 几天前那道说谎问题时用dp的摞箱子模型求的最大的不相交区间个数,但是这题不能用这个方法,因为这题是动态的查询,不可能每个查询dp一次,超时. 这题用贪心策略.求区间[l~r]里的最大不相交区间,贪心策略就应该先选该区间内右端点最小的,这样给以后待选的区间留下更大的空间,所以我们的做法就是先按照区间的右端点排序,然后每次查询依次挑出查询区间里右端点最小的,并且把查询区间的左端点更新为刚才挑出的区间的右端点(这个

《劲道》课程笔记——思维转化

第一个思维 我们的职涯.工作.人际关系和生活的成功与失败,都是逐渐积累而非一夕造成的,每次对话都有影响.任何一次对话都不能保证能够彻底扭转个人的职业生涯.企业发展.人际关系或生活现状,但每一次对话都有这种可能.      对话可以厘清事实,也可以造成混乱.对话可以推动跨领域的团队合作,也可以在严密的隔板上再加上铁丝网.对话可以激励我们去面对最艰巨的挑战,也可以让我们深陷泥沼,心想早上还不如不起床.      对话可以沉闷无趣,也可以带来人性与亲密感的深刻体验. 非真实对话      非真实对话会

POJ 1971 Parallelogram Counting

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

LightOJ - 1058 - Parallelogram Counting(数学,计算几何)

链接: https://vjudge.net/problem/LightOJ-1058 题意: 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 o