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;
}

浙公网安备 33010602011771号