几何+map套set——cf1163C

能灵活用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;
} 
原文地址:https://www.cnblogs.com/zsben991126/p/10899650.html