Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5296 | Accepted: 3136 |
Description
Reza's parents came up with the following idea. They put cardboard partitions into the box. Even if Reza keeps throwing his toys into the box, at least toys that get thrown into different partitions stay separate. The box looks like this from the top:
We want for each positive integer t, such that there exists a partition with t toys, determine how many partitions have t, toys.
Input
A line consisting of a single 0 terminates the input.
Output
Sample Input
4 10 0 10 100 0 20 20 80 80 60 60 40 40 5 10 15 10 95 10 25 10 65 10 75 10 35 10 45 10 55 10 85 10 5 6 0 10 60 0 4 3 15 30 3 1 6 8 10 10 2 1 2 8 1 5 5 5 40 10 7 9 0
Sample Output
Box 2: 5 Box 1: 4 2: 1
這題在poj 2318的基礎上有些變化,首先是輸入的直線不是從左到右順序輸入的,要自己排序,其次,輸出要按出現次數排序,而不是按區間個數排(剛開始沒看清題,直接看的樣例,其實還想複雜了,但是實現了,wa了兩發,再看了下輸出要求,1A)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct Point
{
int x,y;
Point (int a=0,int b=0):x(a),y(b) {}
};
inline int multiply(Point sp,Point ep,Point op)
{
return((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y));
}
bool cmp(const Point a,const Point b)
{
return a.x<b.x;
}
Point a[1001],b[1001];
int c[1001],jug[1001];
int main()
{
int N,M,x1,x2,y1,y2,n,m,mid,i;
while(~scanf("%d",&N))
{
if(N<=0) break;
for(i=0; i<1001; i++)
{
c[i]=jug[i]=0;
}
scanf("%d %d %d %d %d",&M,&x1,&y1,&x2,&y2);
for(i=0; i<N; i++)
{
scanf("%d %d",&b[i].x,&b[i].y);
//(b[i].x,y1) (b[i].y,y2);
}
sort(b,b+N,cmp);
for(i=0; i<M; i++)//toys
scanf("%d %d",&a[i].x,&a[i].y);
for(i=0; i<M; i++)
{
int left=0,right=N-1;
while(left<=right)
{
mid=(left+right)/2;
if(multiply(Point(b[mid].x,y1),Point(b[mid].y,y2),a[i])<0)//叉積小於0說明點在直線左側
right=mid-1;
else left=mid+1;
}
c[left]++;
}//jug[i]代表區間內點有i個的 區間 的個數
for(i=0; i<=N; i++)
jug[c[i]]++;
printf("Box\n");
for(i=1; i<=1000; i++)
if(jug[i]!=0)
printf("%d: %d\n",i,jug[i]);
}
return 0;
}