POJ 2318 2398 计算几何

POJ 2318题意:

有一个大箱子,由n个板分为n+1块,标号为0~n

已知盒子左上角和右下角的坐标及每个板上下两端的横坐标(板不会交错,且按顺序给出)

然后给出玩具的坐标,统计每块空间内玩具个数(保证玩具一定落在空间内,且没有落在隔板上的点)

题解:

二分位置,叉积判断在左侧还是右侧

View Code
 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <algorithm>
 6 
 7 #define N 10000
 8 
 9 using namespace std;
10 
11 struct P
12 {
13     int x,y;
14 }b[N],c[N];
15 
16 int n,m,sx,sy,tx,ty;
17 int up[N],low[N],sw[N],sq[N];
18 int ans[N];
19 
20 inline void read()
21 {
22     scanf("%d%d%d%d%d",&m,&sx,&ty,&tx,&sy);
23     for(int i=1;i<=n;i++) scanf("%d%d",&up[i],&low[i]);
24     for(int i=1;i<=m;i++) scanf("%d%d",&sw[i],&sq[i]);
25     low[0]=up[0]=sx; low[n+1]=up[n+1]=tx;
26 }
27 
28 inline int cross(int ax,int ay,int bx,int by)
29 {
30     return ax*by-ay*bx;
31 }
32 
33 inline int getnum(int i)
34 {
35     int l=1,r=n+1;
36     while(l<=r)
37     {
38         int j=(l+r)>>1;
39         if(cross(up[j]-low[j],ty-sy,sw[i]-low[j],sq[i]-sy)>0) r=j-1;
40         else l=j+1;
41     }
42     return r;
43 }
44 
45 inline void go()
46 {
47     memset(ans,0,sizeof ans);
48     for(int i=1;i<=m;i++)
49     {
50         int num=getnum(i);
51         ans[num]++;
52     }
53     for(int i=0;i<=n;i++) printf("%d: %d\n",i,ans[i]);
54     puts("");
55 }
56 
57 int main()
58 {
59     while(scanf("%d",&n),n) read(),go();
60     return 0;
61 }

POJ 2398题意同上

 唯一不同的是隔板没有按顺序给出,人工排序即可~

View Code
 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <algorithm>
 6 
 7 #define N 10000
 8 
 9 using namespace std;
10 
11 struct P
12 {
13     int up,low;
14 }b[N];
15 
16 int n,m,sx,sy,tx,ty;
17 int up[N],low[N],sw[N],sq[N];
18 int ans[N],ss[N];
19 
20 inline bool cmp(const P &a,const P &b)
21 {
22     return a.up<b.up;
23 }
24 
25 inline void read()
26 {
27     scanf("%d%d%d%d%d",&m,&sx,&ty,&tx,&sy);
28     for(int i=1;i<=n;i++) scanf("%d%d",&b[i].up,&b[i].low);
29     for(int i=1;i<=m;i++) scanf("%d%d",&sw[i],&sq[i]);
30     b[0].low=b[0].up=sx; b[n+1].low=b[n+1].up=tx;
31     sort(b+1,b+1+n,cmp);
32 }
33 
34 inline int cross(int ax,int ay,int bx,int by)
35 {
36     return ax*by-ay*bx;
37 }
38 
39 inline int getnum(int i)
40 {
41     int l=1,r=n+1;
42     while(l<=r)
43     {
44         int j=(l+r)>>1;
45         if(cross(b[j].up-b[j].low,ty-sy,sw[i]-b[j].low,sq[i]-sy)>0) r=j-1;
46         else l=j+1;
47     }
48     return r;
49 }
50 
51 inline void go()
52 {
53     memset(ans,0,sizeof ans);
54     memset(ss,0,sizeof ss);
55     for(int i=1;i<=m;i++)
56     {
57         int num=getnum(i);
58         ans[num]++;
59     }
60     puts("Box");
61     for(int i=0;i<=n;i++) ss[ans[i]]++;
62     for(int i=1;i<=n;i++)
63         if(ss[i]) printf("%d: %d\n",i,ss[i]);
64 }
65 
66 int main()
67 {
68     while(scanf("%d",&n),n) read(),go();
69     return 0;
70 }
没有人能阻止我前进的步伐,除了我自己!
原文地址:https://www.cnblogs.com/proverbs/p/2855402.html