XDU-1153 万神的线段 (排序)

1153: 万神的线段

时间限制:  1 Sec   内存限制:  128 MB
http://acm.xidian.edu.cn/problem.php?id=1153
[ 提交 ][ 状态 ][ 讨论版 ]

题目描述

输入

输出

对于每组数据输出1行,包含1个整数,即平行或共线的线段对数。

样例输入

3
0 0 1 0
1 0 1 1
0 0 1 1
4
0 0 1 1
2 2 3 3
1 2 3 4
2 3 3 3
2
0 0 1 0
1 1 0 1

样例输出

0
3
1

提示

对于第二组样例,第 1 条线段与第 2 条共线,与第 3 条平行,第 2 条线段与第 3 条平行。

对于第三组样例,请注意线段是无向的,因此输入的两条线段平行。


读入线段数据后,直接按照“斜率”排序即可,相互平行的线段必定在一起,统计平行的线段为cnt,则这些平行的线段能构成cnt*(cnt-1)/2对平行线段

注意:cnt得用long long;特判斜率不存在的情况;

我将除法转化为乘法,比较斜率,没有精度误差,不过比赛时WA了好久,最后终于发现:dx可能为负值,所以在存储时,若dx为负值,则dx、dy均取相反数


#include 
#include 
#include 

using namespace std;

struct Node {
    long long dx,dy;

    bool operator < (const Node& a) const {
        if(dx==0)
            return false;
        if(a.dx==0)
            return true;
        return dy*a.dx


你可能感兴趣的:(其他,XDU)