栈外题求优化
  • 板块题目总版
  • 楼主IaLWH
  • 当前回复26
  • 已保存回复26
  • 发布时间2024/8/10 16:09
  • 上次更新2024/8/10 17:00:06
查看原帖
栈外题求优化
486727
IaLWH楼主2024/8/10 16:09

共线(line)\huge{共线(line)}

题目描述

平面上有nn个点p1=(x1,y1),...,pn=(xn,yn)p_1=(x_1,y_1),...,p_n=(x_n,y_n),以及一个特殊点P=(x0,y0)P=(x_0,y_0);保证i∈[1,n],pi≠Pi\in[1,n],p_i\ne P。

问有多少1≤i≠j≤n1\le i\ne j\le n满足P,pi,pjP,p_i,p_j共线。

输入格式

第一行三个整数n,x0,y0n,x_0,y_0。

接下来nn行,第ii行两个整数xi,yix_i,y_i。

输出格式

一行,一个整数表示有多少1≤i≠j≤n1\le i\ne j\le n满足P,pi,pjP,p_i,p_j共线。

样例

输入

3 0 1
1 3
2 5
3 4

输出

2

数据范围

对于15%的数据,n<=1000; 对于100%的数据,1≤n≤105,∀i∈[0,n],∣xi∣,∣yi∣≤106,∀i∈[1,n],(xi,yi)≠(x0,y0)1\le n\le10^5,∀i\in[0,n],|x_i|,|y_i|\le10^6,∀i\in[1,n],(x_i,y_i)\ne(x_0,y_0)。

题目真地码了很久帮忙看看罢(悲)\tiny{题目真地码了很久帮忙看看罢(悲)}

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int lx[114514],ly[114514],ln[114514],ll;

signed main() {
//	freopen("line.in","r",stdin);
//	freopen("line.out","w",stdout);
	int n,Px,Py,px,py,pg,ans=0;
	bool yn;
	scanf("%lld%lld%lld",&n,&Px,&Py);
	for(int i=0; i<n; i++) {
		scanf("%lld%lld",&px,&py);
		px-=Px;
		py-=Py;
		pg=__gcd(px,py);
		px/=pg;
		py/=pg;
		if(!px)py=1;
		else if(!py)px=1;
		yn=1;
		for(int j=0; j<ll; j++) {
			if(lx[j]==px&&ly[j]==py) {
				ln[j]++;
				yn=0;
				ans+=ln[j]-1;
				break;
			}
		}
		if(yn) {
			lx[ll]=px;
			ly[ll]=py;
			ln[ll++]=1;
		}
	}
	if(!ans)ans=1;
	printf("%lld",ans<<1);
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}
2024/8/10 16:09
加载中...