CodeForces 660D

算是一道基础题吧,主要在于如何巧妙地判断平行四边形,看了别人的代码,题解如下

平行四边形判定条件
(x1,y1),(x2,y2),(x3,y3),(x4,y4)
1,3;2,4为两条对角线
x1+x3 == x2+x4 && y1+y3 == y2+y4则为四边形,说白了就是,两条对角线横坐标、纵坐标分别相加(或相减后相等)

证明:

根据平行四边形定义可得

x1+m = x4   y1+n = y4

x2+m = x3   y2+n = y3

所以 x1+x3+m = x2+x4+m 即 x1+x3 = x2+x4

福利:

判断两直线(线段)位置关系
A(a,b) , B(c,d)
 X1 = (int)fabs(a-c);
 Y1 = (int)fabs(b-d);
 X2 = (int)fabs(a-c);
 Y2 = (int)fabs(b-d);
 if(X1*Y2 == X2*Y1)
  printf("这两条线不相交 ");
 else
  printf("这两条线相交 ");

用STLmap存储数据,当键值为两个时,要用pair

#include <stdio.h>
#include <iostream>
#include <string>
#include <algorithm>
#include <string>
#include <string.h>
#include <math.h>
#include <map>
#define MAXN 2005

using namespace std;

int main()
{
    //freopen("caicai.txt","r",stdin);
    map<pair<int,int>,int>point;
    int x[MAXN],y[MAXN];
    int n;
    scanf("%d",&n);
    int i,j,ans = 0;
    for(i = 0;i<n;i++)
    {
        scanf("%d%d",&x[i],&y[i]);
        for(j = 0;j<i;j++)
            ans += point[make_pair(x[i]+x[j],y[i]+y[j])]++;//ans += point[{x[i]+x[j],y[i]+y[j]}]++; CF是拒绝的。
    }
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/caitian/p/5413689.html