标签:puts lower ace upper output sam top tin when
Description
Input
Output
Sample Input
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 Output
0: 2 1: 1 2: 1 3: 1 4: 0 5: 1 0: 2 1: 2 2: 2 3: 2 4: 2
思路:{运用叉积的有关知识判断点,线的关系,降低时间复杂度的话可以考虑二分。}
1 #include<map> 2 #include<set> 3 #include<deque> 4 #include<cmath> 5 #include<queue> 6 #include<stack> 7 #include<vector> 8 #include<cstdio> 9 #include<complex> 10 #include<cstring> 11 #include<cstdlib> 12 #include<iostream> 13 #include<algorithm> 14 #define maxx 5010 15 #define RG register 16 #define LL long long 17 #define db double 18 using namespace std; 19 int cnt[maxx]; 20 struct point{ 21 int x,y; 22 point() {} 23 point (int _x,int _y): x(_x),y(_y) {} 24 point operator -(const point a) const{ 25 return point(x-a.x,y-a.y); 26 } 27 int operator *(const point a) const { 28 return x*a.x+y*a.y; 29 } 30 int operator ^(const point a) const { 31 return x*a.y-y*a.x; 32 } 33 }a[maxx]; 34 int n,m,L,U,loop[maxx]; 35 int main(){ 36 int x,y,xx,yy; 37 while(scanf("%d",&n)&&n){memset(cnt,0,sizeof(cnt)); 38 scanf("%d%d%d%d%d",&m,&x,&y,&xx,&yy); 39 a[0]=a[n+1]=point(0,y-yy);loop[0]=x,loop[n+1]=xx; 40 for(int i=1;i<=n;++i){ 41 scanf("%d%d",&U,&L); 42 a[i]=point(U-L,y-yy); 43 loop[i]=L; 44 } 45 point aa; 46 for(int i=1;i<=m;++i){ 47 scanf("%d%d",&x,&y); 48 int l=0,r=n+1; 49 while(l<=r){ 50 int d=(l+r)>>1;aa=point(x-loop[d],y-yy); 51 if((aa^a[d])<0)r=d-1; 52 else l=d+1; 53 }cnt[l-1]++; 54 } 55 for(int i=0;i<=n;++i) 56 cout<<i<<": "<<cnt[i]<<‘\n‘; 57 cout<<‘\n‘; 58 } 59 return 0; 60 }
标签:puts lower ace upper output sam top tin when
原文地址:http://www.cnblogs.com/zzmmm/p/6949536.html