共线(line)
平面上有n个点p1=(x1,y1),...,pn=(xn,yn),以及一个特殊点P=(x0,y0);保证i∈[1,n],pi=P。
问有多少1≤i=j≤n满足P,pi,pj共线。
第一行三个整数n,x0,y0。
接下来n行,第i行两个整数xi,yi。
一行,一个整数表示有多少1≤i=j≤n满足P,pi,pj共线。
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)。
题目真地码了很久帮忙看看罢(悲)
代码:
#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;
}