CF13D. Triangles

【题目链接】https://codeforces.com/problemset/problem/13/D

【题解】

一道非常经典而古老的三角形计数。

考虑三角形的有向面积。

显然有:$S_{ riangle ABC}=S_{ riangle OAB}+S_{ riangle OBC}+S_{ riangle 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 }
原文地址:https://www.cnblogs.com/RenSheYu/p/12274200.html