SDUT 2022 Spring Team Contest(for 21) - 14 - Virtual Judge

There are nn lines l_1,l_2,\dots,l_nl1​,l2​,…,ln​ on the 2D-plane.

Staring at these lines, Calabash is wondering how many pairs of (i,j)(i,j) that 1\leq i<j\leq n1≤i<j≤n and l_i,l_jli​,lj​ share at least one common point. Note that two overlapping lines also share common points.

Please write a program to solve Calabash's problem.

Input

The first line of the input contains an integer T(1\leq T\leq 1000)T(1≤T≤1000), denoting the number of test cases.

In each test case, there is one integer n(1\leq n\leq 100000)n(1≤n≤100000) in the first line, denoting the number of lines.

For the next nn lines, each line contains four integers xa_i,ya_i,xb_i,yb_i(|xa_i|,|ya_i|,|xb_i|,|yb_i|\leq 10^9)xai​,yai​,xbi​,ybi​(∣xai​∣,∣yai​∣,∣xbi​∣,∣ybi​∣≤109). It means l_ili​ passes both (xa_i,ya_i)(xai​,yai​) and (xb_i,yb_i)(xbi​,ybi​). (xa_i,ya_i)(xai​,yai​) will never be coincided with (xb_i,yb_i)(xbi​,ybi​).

It is guaranteed that \sum n\leq 10^6∑n≤106.

Output

For each test case, print a single line containing an integer, denoting the answer.

Sample 1

Inputcopy Outputcopy
3
2
0 0 1 1
0 1 1 0
2
0 0 0 1
1 0 1 1
2
0 0 1 1
0 0 1 1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double maxx=2e9+10;
map<double,ll>mp;
map<int,double>mk;
map<int,double>mb;
map<pair<double,double>,ll>mp1;
ll mul(ll n)
{return n*(n-1)/2;
}
int main()
{int t;scanf("%lld",&t);while(t--){mp.clear();mk.clear();mb.clear();mp1.clear();ll n;scanf("%lld",&n);for(int i=0;i<n;i++){double x1,x2,y1,y2;double k,b;scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);if(x1==x2){k=maxx;b=x1;}else{k=1.0*(y1-y2)/(x1-x2);b=y1-k*x1;}mp[k]++;mk[i]=k;mb[i]=b;mp1[make_pair(k,b)]++;}ll sum=0;for(int i=0;i<n;i++){if(mp[mk[i]]>1){sum+=mul(mp[mk[i]]);mp[mk[i]]=0;//遍历时,如果不清零,后面又会取到mk[i],对结果有影响}}for(int i=0;i<n;i++){if (mp1[make_pair(mk[i], mb[i])] > 1){sum -= mul(mp1[make_pair(mk[i], mb[i])]);mp1[make_pair(mk[i], mb[i])] = 0;//同上}}ll ans = mul(n) - sum ;cout << ans << endl;}
}

思路:

题目给的数据都不小,每个坐标的绝对值大小都<=1e9,所以我们要用map来模拟一下。中学生都知道的知识,两条直线,想要有交点,就必须斜率不同。另外,题目说明两条相同的直线,也算是有交点。所以我们在用map记住斜率的时候一定要特别注意这种情况,我们知道一条直线的一般方程是y=kx+b,所以,判断两条有相同斜率的直线是不是同一条,就可以看一下b=y-kx的值,要求输入直线上的坐标,所以b不难求。

k = 1.0 * (y1 - y2) / (x1 - x2);
b = y1 - k * x1;

注意注意注意,我们在中学做一些关于直线的题目的时候,都会想到一种特殊的直线,就是垂直x轴的直线,这样的直线x1==x2,所以k的大小就没有办法用这个公式来求。当时我做的时候也是忘了这一茬,所以就WA了一两次。我再一看题目,每个坐标的绝对值大小都<=1e9,而且都是整数,所以在不考虑上述情况下,|k|<=(1e9+1e9)/1,我看索性把斜率不存在的情况中的k记为2e9+1,b就记为x1。然后这种情况就可以和正常的情况一起做了。然后,我们知道如果有n条斜率不同的线,他们的交点有(n-1) + (n-2) + ... + 2 + 1 = n * (n - 1) / 2 个。先写个函数:

ll mul(ll n)
{return n * (n - 1) / 2;
}

我们用mp[k]++来记住有多少条直线的斜率为k,再用mp1[make_pair(k, b)]++来记住斜率相同的时候会不会有同一条直线的情况。假设每条直线的斜率都不同ans = mul(n),然后减去k相同的直线不能形成的交点(平行),当然也必须是mul(n1),还要加上k相同b相同的情况mul(n2)。

C - Line-line Intersection相关推荐

  1. C++line segment intersection线段求交(交点)(附完整源码)

    C++line segment intersection线段求交的实现 C++line segment intersection线段求交实现的完整源码(定义,实现,main函数测试) C++line ...

  2. LINE: Large-scale Information Network Embedding

    LINE算法意义: 1.适用于任意类型的网络,有向无向有权无权 2.清晰优化目标函数.维护一阶和二阶相似度 3.百万级和十亿级条边几个小时训练完 4.LINE是WWW2015引用量最高的文章 5.与D ...

  3. c++预处理命令 #line 用法

    c++预处理命令 #line 用法 #line #line 语法: #line line_number "filename" #line命令是用于更改__LINE__ 和 __FI ...

  4. [LeetCode] Max Points on a Line 题解

    题意 Given n points on a 2D plane, find the maximum number of points that lie on the same straight lin ...

  5. HDU 6631 line symmetric(枚举)

    首先能想到的是至少有一对相邻点或者中间间隔一个点的点对满足轴对称,那么接下来只需要枚举剩下的点对是否满足至多移动一个点可以满足要求. 第一种情况,对于所有点对都满足要求,那么Yes. 第二种情况,有一 ...

  6. d3设置line长度_万物皆可Embedding之LINE算法解读

    需要论文的朋友可以后台私信我获取 前言 上一篇文章给大家带来了Graph Embedding技术中的代表算法Deepwalk,今天给大家介绍graph embedding又一代表算法--LINE,LI ...

  7. d3设置line长度_Graph Embedding之LINE算法解读

    需要论文的朋友可以后台私信我获取 前言 上一篇文章给大家带来了Graph Embedding技术中的代表算法Deepwalk,今天给大家介绍graph embedding又一代表算法--LINE,LI ...

  8. AutoCAD .Net 创建直线Line

    以下代码展示: * 创建直线 * 设置图元的图层 * 设置图元的颜色 * 设置图元的线型 * 设置图元的线宽 using Autodesk.AutoCAD.Runtime; using Autodes ...

  9. 论文|LINE算法原理、代码实战和应用

    1 概述 LINE是2015年微软发表的一篇论文,其全称为: Large-scale Information Network Embedding.论文下载地址:https://arxiv.org/pd ...

  10. 设计如下类: 1) 建立一个Point类,表示平面中的一个点;建立一个Line类,表示平面中的一条线端, 内含两个Point类的对象;建立Triangle类,表示一个三角形

    设计如下类:     1) 建立一个Point类,表示平面中的一个点:建立一个Line类,表示平面中的一条线端,     内含两个Point类的对象:建立Triangle类,表示一个三角形,内含三个L ...

最新文章

  1. add to -append Backend implementation
  2. 【线性代数】2-5:逆(Inverse)
  3. TypeError: __str__ returned non-string (type NoneType)
  4. C语言__LINE__实现原理
  5. Python学习Day7
  6. 前台传递过来的参数遍历
  7. Glide修改本地图片缓存路径
  8. 浏览器不兼容原因及解决办法
  9. ioncube linux,linux 下ionCube安装
  10. 活在当下,谋在未来,国内外新能源汽车城市物流配送运营模式创新
  11. 初涉Workflow(2)——XPDL
  12. python全栈构图_Python全栈 Web(边框、盒模型、背景)
  13. 全网详解如何设计数据库的ER图,即实体关系图
  14. 异贝,通过移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例55
  15. OPENCART之兼容多种浏览器的加入收藏夹扩展功能插件(CROSS-BROWSER BOOKMAR
  16. 2022年基础设施行业10大技术应用趋势
  17. shell编程中expr的用法
  18. 线程池内运行的线程抛异常,线程池会怎么办
  19. ipad手写笔哪个牌子好用?便宜的ipad触控笔
  20. python制作游戏修改器_基于Python的游戏是如何制作的?

热门文章

  1. C# 语音端点检测(VAD)实现过程分析
  2. 002__Hive的tez引擎的配置步骤
  3. empty()与isEmpty(),空判断
  4. Linux服务器NTP客户端时钟同步配置方法
  5. larval 操作mysql数据库_laravel操作数据库
  6. gdal-ogr2ogr空间数据转换
  7. PhotoSwipe简介-专为移动触摸设备设计的相册/画廊.兼容所有iPhone、iPad、黑莓6+,以及桌面浏览器.底层实现基于HTML/CSS/JavaScript,是一款免费开源的相册产品
  8. SQL server数据库常用代码大全
  9. selenium定位到元素后获取其属性_selenium 元素查找与属性
  10. 【微服】单体、SOA、微服务