poj2398

题解:

计算几何入门题

对每个二分最近的在它右边的杆子

如何判断一个杆子在它右边呢

计算机判断这些要更善于利用点积和叉积

如果叉积为正代表在顺时针方向叉积为负在逆时针

发现要在struct里面重载运算符和struct调用struct

就必须要

Point() {}
  Point(int x1,int y1)
  {
    x=x1; y=y1;
  }

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (int i=h;i<=t;i++)
#define dep(i,t,h) for (int i=t;i>=h;i--)
#define me(x) memset(x,0,sizeof(x))
#define mid ((h+t)>>1)
#define ll long long
const int N=1e4;
int n,m,x1,y1,x2,y2,x,y,ans[N],num[N];
struct Point{
  int x,y;
  Point() {}
  Point(int x1,int y1)
  {
    x=x1; y=y1;
  }
  Point operator +(const Point &b) const 
  {
    return Point(x+b.x,y+b.y);
  }
  Point operator -(const Point &b) const
  {
    return Point(x-b.x,y-b.y);
  }
  int operator *(const Point &b) const
  {
    return x*b.x+y*b.y;
  }
  int operator ^(const Point &b) const
  {
    return x*b.y-y*b.x;
  }
};
struct Line{
  Line(){}
  Point s,e;
  Line(Point s1,Point e1)
  {
    s=s1,e=e1;
  }
}l[N];
bool cmp(Line x,Line y)
{
  return x.s.x<y.s.x;
}
IL bool check(Line x,Point y)
{
  return ((y-x.s)^(x.e-x.s))<0?0:1;
}
int main()
{
  freopen("1.in","r",stdin);
  freopen("1.out","w",stdout);
  ios::sync_with_stdio(false);
  while (cin>>n&&n)
  {
    cin>>m>>x1>>y1>>x2>>y2;
    rep(i,1,n)
    {
      cin>>x>>y;
      l[i]=Line(Point(x,y1),Point(y,y2));
    }
    n++;
    l[n]=Line(Point(x2,y1),Point(x2,y2));
    sort(l+1,l+n+1,cmp);
    me(ans); me(num);
    while (m--)
    {
      cin>>x>>y;
      Point p=Point(x,y);
      int h=1,t=n;
      while (h<t)
      {
        if (check(l[mid],p)) t=mid; else h=mid+1;
      }
      ans[h]++;
    }
    rep(i,1,n) if (ans[i]>0) num[ans[i]]++;
    cout<<"Box"<<endl;
    rep(i,1,n)
      if (num[i]>0) cout<<i<<": "<<num[i]<<endl;
  }
  return 0; 
}

 

posted @ 2018-11-19 20:53  尹吴潇  阅读(127)  评论(0编辑  收藏  举报