题意
思路
这个题和今年蓝桥杯的那个填空题很相似(枚举向量,斜率),其实就是构造一个向量,起点是这个人的位置,终点是这个人的朝向,构造出来这个向量,如果找到向量相对的情况那就加起来。
为什么要两条向量平行才行?
其实就是因为,可以让两个人的起点坐标连线,必须要同时到达这个连线位置才会四目相视,因为这两个人旋转的角速度一定相等,因此,必须平行(根据平行四边形的性质,两个夹角相等)
那么因为(有点类似于计算几何的题目)因此最好不要使用double 用pair存一下向量的朝向即可(最好用int)
AC代码
#include<iostream>
#include<map>
#include<cmath>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
int main(){
int T;
cin>>T;
while(T--){
ll n,ans=0;
cin>>n;
map<pair<ll,ll>,ll>mp;
for(ll i=1;i<=n;i++){
ll a,b,c,d;
cin>>a>>b>>c>>d;
ll x=a-c;
ll y=b-d;
ll u=abs(gcd(x,y));
x/=u;
y/=u;
// cout<<x<<' '<<y<<endl;
mp[{x,y}]++;
ans+=mp[{-x,-y}];
}
cout<<ans<<endl;
}
}