注意到只要两个人初始的朝向相反就可以看到对方,否则不行。直接把斜率搞成一个 pair 压到 map 里存个数就行了。
pair
map
#include #include #include #define mp std::make_pair typedef std::pair pii; int n; std::map 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