Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 14437 | Accepted: 7001 |
Descriptiondom
Inputide
Outputthis
Sample Inputidea
5 6 0 10 60 0 3 1 4 3 6 8 10 10 15 30 1 5 2 1 2 8 5 5 40 10 7 9 4 10 0 10 100 0 20 20 40 40 60 60 80 80 5 10 15 10 25 10 35 10 45 10 55 10 65 10 75 10 85 10 95 10 0
Sample Outputspa
0: 2 1: 1 2: 1 3: 1 4: 0 5: 1 0: 2 1: 2 2: 2 3: 2 4: 2
Hintcode
1 #include<stdio.h> 2 /* 二維幾何 */ 3 /* 須要包含的頭文件 */ 4 #include <cmath > 5 6 /* 經常使用的常量定義 */ 7 const double INF = 1e200; 8 const double EP = 1e-10; 9 const double PI = acos(-1.0); 10 11 /* 基本幾何結構 */ 12 struct Point 13 { 14 double x,y; 15 Point(double a=0, double b=0){x=a,y=b;} 16 friend Point operator+(const Point &ta,const Point &tb) 17 { 18 return Point(ta.x+tb.x,ta.y+tb.y); 19 } 20 friend Point operator-(const Point &ta,const Point &tb) 21 { 22 return Point(ta.x-tb.x,ta.y-tb.y); 23 } 24 }; 25 struct Vec2D//二維向量,*重載爲點乘,/重載爲叉乘 26 { 27 double x,y; 28 Vec2D(double ta,double tb){x=ta,y=tb;} 29 Vec2D(Point &ta){x=ta.x,y=ta.y;} 30 friend double operator*(const Vec2D &ta,const Vec2D &tb) 31 { 32 return ta.x*tb.x+ta.y*tb.y; 33 } 34 friend double operator/(const Vec2D &ta,const Vec2D &tb) 35 { 36 return ta.x*tb.y-ta.y*tb.x; 37 } 38 friend Vec2D operator+(const Vec2D &ta,const Vec2D &tb) 39 { 40 return Vec2D(ta.x+tb.x,ta.y+tb.y); 41 } 42 friend Vec2D operator-(const Vec2D &ta,const Vec2D &tb) 43 { 44 return Vec2D(ta.x-tb.x,ta.y-tb.y); 45 } 46 Vec2D operator=(const Vec2D &ta) 47 { 48 x=ta.x,y=ta.y; 49 return *this; 50 } 51 }; 52 struct LineSeg //線段,重載了/做爲叉乘運算符,*做爲點乘運算符 53 { 54 Point s,e; 55 LineSeg(){s=Point(0,0),e=Point(0,0);} 56 LineSeg(Point a, Point b){s=a,e=b;} 57 friend double operator*(const LineSeg &ta,const LineSeg &tb) 58 { 59 return (ta.e.x-ta.s.x)*(tb.e.x-tb.s.x)+(ta.e.y-ta.s.y)*(tb.e.y-tb.s.y); 60 } 61 friend double operator/(const LineSeg &ta,const LineSeg &tb) 62 { 63 return (ta.e.x-ta.s.x)*(tb.e.y-tb.s.y)-(ta.e.y-ta.s.y)*(tb.e.x-tb.s.x); 64 } 65 LineSeg operator=(const LineSeg &ta) 66 { 67 s=ta.s,e=ta.e; 68 return *this; 69 } 70 71 }; 72 struct Line // 直線的解析方程 a*x+b*y+c=0 爲統一表示,約定 a >= 0 73 { 74 double a,b,c; 75 Line(double d1=1, double d2=-1, double d3=0){ a=d1,b=d2,c=d3;} 76 }; 77 78 LineSeg ls[6000]; 79 int n,m,x1,x2,y1,y2,num[6000]; 80 void sc(void) 81 { 82 LineSeg tmp; 83 tmp.e=Point(x1,y1); 84 int l=1,r=n+1,mid,ans; 85 while(l<=r) 86 { 87 mid=l+r>>1; 88 tmp.s=ls[mid].s; 89 if(ls[mid]/tmp>0) l=mid+1,ans=mid; 90 else r=mid-1; 91 } 92 num[ans]++; 93 } 94 int main(void) 95 { 96 while(scanf("%d%d%d%d%d%d",&n,&m,&x1,&y1,&x2,&y2)==6 && n) 97 { 98 ls[1]=LineSeg(Point(x1,y1),Point(x1,y2)); 99 ls[n+2]=LineSeg(Point(x2,y1),Point(x2,y2)); 100 for(int i=1;i<=n;i++) 101 scanf("%d%d",&x1,&x2),ls[i+1]=LineSeg(Point(x1,y1),Point(x2,y2)); 102 for(int i=1;i<=m;i++) 103 scanf("%d%d",&x1,&y1),sc(); 104 for(int i=1;i<=n+1;i++) 105 printf("%d: %d\n",i-1,num[i]),num[i]=0; 106 printf("\n"); 107 108 } 109 return 0; 110 }