hdu 4380 Farmer Greedy (计算几何 2012 Multi-University Training Contest 9 )

http://acm.hdu.edu.cn/showproblem.php?pid=4380

 题意:  给出 n个房子的位置 。和 m个 金矿的位置 ,从  n 个房子里选出三个(组成三角形),求出有多少种选法 是 三角形 内的金矿数为 奇数?

 

题解:

 预处理  枚举 从 n 个房子里 选出 2个i,j 记录 在其上方的 金矿数dp[i][j],枚举所有的三角形 那么 三角形 内的点为  fabs(dp[i][k] - dp][i][j] - dp[j][k]);

 

 

 

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<set>
 7 #include<map>
 8 #include<queue>
 9 #include<vector>
10 #include<string>
11 #define Min(a,b) a<b?a:b
12 #define Max(a,b) a>b?a:b
13 #define CL(a,num) memset(a,num,sizeof(a));
14 #define maxn  120
15 #define eps  1e-8
16 #define inf 100000000
17 #define mx 1<<60
18 #define ll   __int64
19 using namespace std;
20 struct house
21 {
22     double  x;
23     double y;
24 }a[maxn],b[maxn * 10];
25 int cmp(house a,house b)
26 {
27     if(a.x == b.x) return a.y < b.y ;
28     else  return a.x < b.x ;
29 }
30 double  in(house a,house b,house c)
31 {
32      return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
33 }
34 
35 int dp[maxn][maxn] ;
36 int main()
37 {
38     int n,m,i,j,k;
39      int cas = 0;
40     while(scanf("%d%d",&n,&m)!=EOF)
41     {
42 
43         for(i = 0; i < n;i++)
44          {
45              scanf("%lf%lf",&a[i].x,&a[i].y);
46          }
47          sort(a,a + n,cmp);
48          for(i = 0; i < m;i++)
49          {
50              scanf("%lf%lf",&b[i].x,&b[i].y);
51          }
52 
53          for(i = 0 ; i < n  ;i++)
54          {
55              for(j = i + 1; j < n;j++)
56              {
57 
58                  dp[i][j] = 0;
59                  for(k = 0;k < m;k++)
60                  {
61                     if(b[k].x >= a[i].x && b[k].x < a[j].x )//注意 右边要是开区间 (以免重减)
62                         if(in(a[i],a[j],b[k]) > 0) dp[i][j]++;
63                  }
64 
65              }
66          }
67          int  ans = 0;
68          for(i = 0 ; i < n  ;i++)
69          {
70              for(j = i + 1 ;j < n  ;j++)
71              {
72                  for(k = j + 1; k < n ;k++)
73                  {
74 
75                    int  tmp = abs(dp[i][k] - dp[i][j] - dp[j][k]) ;
76 
77                    if(tmp&1) ans ++;
78 
79                  }
80              }
81          }
82         printf("Case %d: %d\n", ++cas, ans);
83 
84     }
85 }

 

 

 

 

 

 

 

 

posted @ 2012-08-22 15:59  Szz  阅读(401)  评论(0编辑  收藏  举报