题意:同样是n个隔板把矩形分为n+1个部分,然后有些点分布在矩形上面(不会在板子上),然后问包含同样数目的点有多少个,一一列举出来。
分析:这个题和POJ2318是类似的,只不过这个题的隔板是无须的,得排个序,其他的类似。
×××哇有点想回家,写篇博客平缓一下×××
参考代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn = 1e3+5;
int n,m,px1,py1,px2,py2;
int tp[maxn];
int ans[maxn];
struct Point{
int x,y;
Point(){}
Point( int xx, int yy)
{
x = xx;
y = yy;
}
Point operator - ( const Point &p)const
{
return Point(x-p.x,y-p.y);
}
int operator * ( const Point &p)const
{
return x*p.y-p.x*y;
}
};
struct Line{
Point s,e;
Line(){}
Line( Point ss, Point ee)
{
s = ss;
e = ee;
}
};
Line line[maxn];
bool cmp( const Line &l1, const Line &l2)
{
if( min(l1.s.x,l1.e.x) == min(l2.s.x,l2.e.x))
return max(l1.s.x,l1.e.x) < max(l2.s.x,l2.e.x);
return min(l1.s.x,l1.e.x) < min(l2.s.x,l2.e.x);
}
//这里如果返回值大于0,那么p1p3在p1p2的顺时针方向,反之在逆时针方向
int xmult( Point p1, Point p2, Point p3)
{
return (p2-p1)*(p3-p1);
}
int main()
{
while( ~scanf("%d",&n) && n)
{
scanf("%d%d%d%d%d",&m,&px1,&py1,&px2,&py2);
for( int i = 0; i < n; i++)
{
int ui,li;
scanf("%d%d",&ui,&li);
line[i] = Line(Point(ui,py1),Point(li,py2));
}
line[n] = Line(Point(px2,py1),Point(px2,py2));
sort(line,line+n+1,cmp);
mem(tp,0);
mem(ans,0);
int cnt = m;
while( cnt--)
{
int x,y;
scanf("%d%d",&x,&y);
Point p = Point(x,y);
int l = 0, r = n;
int tmp;
while( l <= r)
{
int mid = (l+r)>>1;
if( xmult(p,line[mid].s,line[mid].e) < 0)//>0对应写出来也好
{
tmp = mid;
r = mid-1;
}
else
l = mid+1;
}
tp[tmp]++;
}
// for( int i = 0; i <= n; i++)
// printf("#%d %d\n",i,tp[i]);
for( int i = 0; i <= n; i++)
{
if( tp[i] > 0)
ans[tp[i]]++;
}
puts("Box");
for( int i = 0; i <= m; i++)
{
if( ans[i])
printf("%d: %d\n",i,ans[i]);
}
}
return 0;
}