CF1468F Full Turn 题解
注意到只要两个人初始的朝向相反就可以看到对方,否则不行。直接把斜率搞成一个 pair
压到 map
里存个数就行了。
点击查看代码
#include<cstdio>
#include<iostream>
#include<map>
#define mp std::make_pair
typedef std::pair<int,int> pii;
int n;
std::map<pii,int> ms;
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
int main(){
int T;scanf("%d",&T);while(T--){
scanf("%d",&n);ms.clear();
long long ans=0;
for(int i=1;i<=n;++i){
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int dx=x2-x1,dy=y2-y1;bool fx=0,fy=0;
if(dx<0) dx*=-1,fx=1;if(dy<0) dy*=-1,fy=1;
int g=gcd(dx,dy);dx/=g,dy/=g;
if(fx) dx*=-1;if(fy) dy*=-1;
ans+=ms[mp(-dx,-dy)];
ms[mp(dx,dy)]++;
}
printf("%lld\n",ans);
}
return 0;
}
//F