题目
http://poj.org/problem?id=2318
分析:
判断某个玩具在第几个盒子中;
设置一个特殊点O,为整个盒子的左下角点;
对于某个玩具,从n~1依次判断每个隔板,看玩具点是否和O点处于隔板两侧;
第一个使得其处于两侧的隔板,就是此玩具所处的位置;
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const double eps=1e-8;
int sgn(double x)
{
if(x>eps) return 1;
if(x<-eps) return -1;
return 0;
}
inline double add(double a,double b)
{
if(abs(a+b)<eps*(abs(a)+abs(b))) return 0;
return a+b;
}
struct Point{
double x,y;
Point(double x=0,double y=0) :x(x),y(y) {}
Point operator + (Point p) {return Point(x+p.x,y+p.y);}
Point operator - (Point p) {return Point(x-p.x,y-p.y);}
Point operator * (double d){return Point(x*d,y*d);}
bool operator < (Point p) {return x!=p.x?x<p.x:y<p.y;}
double dot(Point p) {return add(x*p.x,y*p.y);} //内积
double det(Point p) {return add(x*p.y,-p.x*y);} //外积
Point ver() {return Point(-y,x);} //垂直向量
};
bool on_seg(Point p1,Point p2,Point p) //判断点在线段上
{
return (p1-p).det(p2-p)==0&&(p1-p).dot(p2-p)<=0;
}
Point intersection(Point p1,Point p2,Point q1,Point q2) //求两直线交点
{
return p1+(p2-p1)*((q2-q1).det(q1-p1)/(q2-q1).det(p2-p1));
}
bool same_side(Point p1,Point p2,Point q1,Point q2)
{
int A=p2.y-p1.y,B=p1.x-p2.x,C=p2.x*p1.y-p1.x*p2.y;
return sgn((A*q1.x+B*q1.y+C)*(A*q2.x+B*q2.y+C))>0;
}
const int Tmax=5005;
int n,m,ans[Tmax];
Point upleft,lowright,up[Tmax],down[Tmax],tmp,ori;
void work()
{
int l=0,r=n+1,mid;
while(l<r)
{
mid=(l+r+1)/2;
if(same_side(up[mid],down[mid],ori,tmp)==true) r=mid-1;
else l=mid;
}
ans[r]++;
return;
}
int main()
{
int i;
while(scanf("%d",&n)==1&&n>0)
{
memset(ans,0,sizeof(ans));
scanf("%d",&m);
scanf("%lf%lf",&upleft.x,&upleft.y);
scanf("%lf%lf",&lowright.x,&lowright.y);
up[0].x=upleft.x;up[0].y=upleft.y;
down[0].x=upleft.x;down[0].y=lowright.y;
ori.x=upleft.x-1;ori.y=lowright.y;
for(i=1;i<=n;i++)
{
scanf("%lf%lf",&up[i].x,&down[i].x);
up[i].y=upleft.y;
down[i].y=lowright.y;
}
up[n+1].x=lowright.x;up[n+1].y=upleft.y;
down[n+1].x=lowright.x;down[n+1].y=lowright.y;
for(i=1;i<=m;i++)
{
scanf("%lf%lf",&tmp.x,&tmp.y);
work();
}
for(i=0;i<=n;i++)
printf("%d: %d\n",i,ans[i]);
printf("\n");
}
return 0;
}