Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5016 | Accepted: 2978 |
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多了个排序。暴力解16MS
#include <iostream> #include <cstdio> #include <string.h> #include <math.h> #include <algorithm> using namespace std; const int N = 2005; struct Point { int x,y; } p[N],q[N]; struct Line{ Point a,b; }line[N]; int n,m,x1,y11,x2,y2; bool used[N]; int cnt[N]; ///判断某区域的点数量 int area[N]; int mult(Point a,Point b,Point c){ return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x); } int cmp(Line l1,Line l2){ if (min(l1.a.x, l1.b.x)==min(l2.a.x, l1.b.x)) return max(l1.a.x, l1.b.x) < max(l2.a.x, l1.b.x); return min(l1.a.x, l1.b.x) < min(l2.a.x, l1.b.x); } int main() { while(scanf("%d",&n)!=EOF,n) { scanf("%d%d%d%d%d",&m,&x1,&y11,&x2,&y2); memset(used,false,sizeof(used)); memset(cnt,0,sizeof(cnt)); memset(area,0,sizeof(area)); int k=1; for(int i=1;i<=n;i++){ scanf("%d%d",&line[i].a.x,&line[i].b.x); line[i].a.y=y11,line[i].b.y=y2; } sort(line+1,line+n+1,cmp); /*for(int i=1;i<=n;i++){ printf("%d %d %d %d\n",line[i].a.x,line[i].a.y,line[i].b.x,line[i].b.y); }*/ for(int i=0;i<m;i++){ scanf("%d%d",&q[i].x,&q[i].y); } int sum=0; for(int i=1;i<=n;i++){ for(int j=0;j<m;j++){ if(mult(line[i].a,q[j],line[i].b)>0&&!used[j]){ cnt[i-1]++; used[j]=true; } } sum+=cnt[i-1]; } cnt[n] = m-sum; for(int i=0;i<=n;i++){ if(cnt[i]){ area[cnt[i]]++; } }printf("Box\n"); for(int i=1;i<=m;i++){ if(area[i]){ printf("%d: %d\n",i,area[i]); } } } return 0; }