能灵活用map+set的组合就能过这题了
/* 分成三个步骤来做: 1.通过点两两构造线 by=ax+c,先求a,b,再求c,用gcd(d,b)简化 2.线去重:用map+pair 3.统计交点 */ #include<bits/stdc++.h> #include<map> using namespace std; #define ll long long #define maxn 2005 map<pair<int,int>,set<int> > mp; map<pair<int,int>,set<int> >::iterator it; struct Node{int x,y;}p[maxn]; int main(){ ll n,ans=0,lines=0;cin>>n; for(int i=1;i<=n;i++)cin>>p[i].x>>p[i].y; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++){ int a=p[i].y-p[j].y,b=p[i].x-p[j].x; int d=__gcd(a,b); a/=d,b/=d; if(a<0 || a==0&&b<0){b*=-1;a*=-1;} int c=(ll)b*p[i].y-(ll)a*p[i].x; pair<int,int> p=make_pair(a,b); if(mp[p].find(c)==mp[p].end()){ ++lines; mp[p].insert(c); ans+=(ll)lines-mp[p].size();//所有已经存在的线-平行的线 } } cout<<ans<<endl; }