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 }

 

 

你可能感兴趣的:(poj)