[计算几何] hdu 4380 Farmer Greedy
来源:互联网 发布:网络上的招嫖广告词 编辑:程序博客网 时间:2024/06/03 15:12
/**[计算几何] hdu 4380 Farmer Greedy统计n个点中任意一三角形内点的个数,预处理出每条线段下的点的个数。一点小技巧,避免统计时判断三角形的形状,将n个点按x排个序。一点小trick,叉积求判断点在线段下面是会超32bit*/#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define N 101#define M 1001struct _point{ int x,y; void input() { scanf("%d%d",&x,&y); }}g[M],h[N];int mat[N][N];int n,m;bool cmp(_point a,_point b){ if(a.x == b.x) return a.y < b.y; return a.x < b.x;}bool under(int i,int j,int k){ if(g[k].x < h[i].x || g[k].x >= h[j].x) return 0; int x1 = -g[k].x + h[i].x, y1 = -g[k].y + h[i].y, x2 = -g[k].x + h[j].x, y2 = -g[k].y + h[j].y; return 1LL * x1 * y2 < 1LL * x2 * y1;}int main(){ int i,j,k,cas = 0; while(scanf("%d%d",&n,&m) != EOF){ for(i = 0; i < n; ++i) h[i].input(); for(i = 0; i < m; ++i) g[i].input(); sort(h,h + n,cmp); memset(mat,0,sizeof(mat)); for(i = 0; i < n; ++i) for(j = i + 1; j < n; ++j) for(k = 0; k < m; ++k) if(under(i,j,k)) mat[i][j]++,mat[j][i]++; int res = 0; for(i = 0; i < n; ++i) for(j = i + 1; j < n; ++j) for(k = j + 1; k < n; ++k) if(abs(mat[i][k] - mat[i][j] - mat[j][k]) & 1) ++res; printf("Case %d: %d\n",++cas,res); } return 0;}