[计算几何] 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;}

原创粉丝点击