【题目链接】https://codeforces.com/problemset/problem/13/D
【题解】
一道非常经典而古老的三角形计数。
考虑三角形的有向面积。
显然有:$S_{\triangle ABC}=S_{\triangle OAB}+S_{\triangle OBC}+S_{\triangle OCA}$。
因此对每对点先统计一遍,再枚举三个点即可 $O(1)$ 计算。
效率 $O(n^3)$。
【代码】
1 #include<bits/stdc++.h> 2 const int inf=1<<30; 3 int cnt[510][510],n,m; 4 struct Vector 5 { 6 long long x,y; 7 Vector(long long _x=0,long long _y=0){x=_x;y=_y;} 8 inline friend Vector operator - ( const Vector &u,const Vector &v ) { return Vector(u.x-v.x,u.y-v.y); } 9 inline friend long long operator ^ ( const Vector &u,const Vector &v ) { return u.x*v.y-u.y*v.x; } 10 }A[510],B[510]; 11 signed main() 12 { 13 scanf("%d%d",&n,&m); 14 for ( int i=1,x,y;i<=n;i++ ) scanf("%d%d",&x,&y),A[i]=Vector(x,y); 15 for ( int i=1,x,y;i<=m;i++ ) scanf("%d%d",&x,&y),B[i]=Vector(x,y); 16 Vector p=Vector(-inf,-inf); 17 for ( int i=1;i<=n;i++ ) for ( int j=1;j<=n;j++ ) if ( ((A[i]-p)^(A[j]-p))>0 ) 18 { 19 for ( int k=1;k<=m;k++ ) cnt[i][j]+=(((A[i]-p)^(B[k]-p))>0)&(((A[j]-A[i])^(B[k]-A[i]))>0)&(((p-A[j])^(B[k]-A[j]))>0); 20 cnt[j][i]=-cnt[i][j]; 21 } 22 int ans=0; 23 for ( int i=1;i<=n;i++ ) for ( int j=i+1;j<=n;j++ ) for ( int k=j+1;k<=n;k++ ) ans+=(cnt[i][j]+cnt[j][k]+cnt[k][i])==0; 24 return !printf("%d",ans); 25 }