D - Line Crossing

题目链接:https://atcoder.jp/contests/abc402/tasks/abc402_d

题意:

圆上有n个点,挑出mx2个点组成m条线段,求这m条线段其中相交个数

思路:

结论:圆上两点a1,b1组成线段平行于另一条线段a2,b2当且仅当(a1+b1)mod n = (a2+b2) mod n

答案=方案总数 - 平行方案数

int a[maxn];
int b[maxn];
map<int,int>mp;
void solve(){
    int n,m;cin>>n>>m;

    rep(i,1,m){
        cin>>a[i]>>b[i];
        mp[(a[i]+b[i])%n]++;
    }

    int ans=m*(m-1)/2;
    for(auto x:mp){
        int num=x.se;
        ans-=(num)*(num-1)/2;
    }

    cout<<ans<<endl;
}
posted @ 2025-04-24 21:14  Marinaco  阅读(27)  评论(0)    收藏  举报
//雪花飘落效果