标签:res ref aws different div ima outside const order
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
0: 2
1: 1
2: 1
3: 1
4: 0
5: 1
0: 2
1: 2
2: 2
3: 2
4: 2
给出矩形的左上、右下坐标,按顺序给出n条线段在矩形上两条横边上的截距。这n条直线将矩形分成n+1块。给出m个点,问每个小块中有几个点。
还记得之前的某篇博客讲过叉积的性质吗?
叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系:
这里同理,我们只需要扫过每条直线判断点在线的左端还是右端。
当然可以二分实现:我们设判断的点为(x,y),直线的上下截距分别为u,d,矩形上边纵坐标ya,下边yb。
对于二分出的mid值
if (Point(x-d[mid],y-yb)*Point(u[mid]-d[mid],ya-yb)>0) l=mid+1;
else r=mid-1,ans=mid;
这里直线0~n-1编号,所以ans初值应该赋为n。
1 #include<set> 2 #include<map> 3 #include<ctime> 4 #include<cmath> 5 #include<queue> 6 #include<stack> 7 #include<cstdio> 8 #include<string> 9 #include<vector> 10 #include<cstring> 11 #include<cstdlib> 12 #include<iostream> 13 #include<algorithm> 14 #define LL long long 15 #define RE register 16 #define IL inline 17 using namespace std; 18 const int N=5000; 19 20 int n,m,xa,xb,ya,yb; 21 int d[N+5],u[N+5]; 22 struct Point 23 { 24 int x,y; 25 Point (){}; 26 Point (int _x,int _y) {x=_x,y=_y;} 27 int operator *(const Point &a) 28 const{ 29 return x*a.y-y*a.x; 30 } 31 }; 32 int cnt[N+5],x,y; 33 34 IL int Dev(int x,int y); 35 36 int main() 37 { 38 scanf("%d",&n); 39 while (n) 40 { 41 memset(cnt,0,sizeof(cnt)); 42 scanf("%d%d%d%d%d",&m,&xa,&ya,&xb,&yb); 43 for (RE int i=0;i<n;i++) scanf("%d%d",&u[i],&d[i]); 44 for (RE int i=1;i<=m;i++) 45 { 46 scanf("%d%d",&x,&y); 47 cnt[Dev(x,y)]++; 48 } 49 for (RE int i=0;i<=n;i++) printf("%d: %d\n",i,cnt[i]); 50 printf("\n"); 51 scanf("%d",&n); 52 } 53 return 0; 54 } 55 56 IL int Dev(int x,int y) 57 { 58 int l=0,r=n-1,ans=n,mid; 59 while (l<=r) 60 { 61 mid=(l+r)>>1; 62 if (Point(x-d[mid],y-yb)*Point(u[mid]-d[mid],ya-yb)>0) l=mid+1; 63 else r=mid-1,ans=mid; 64 } 65 return ans; 66 }
标签:res ref aws different div ima outside const order
原文地址:http://www.cnblogs.com/NaVi-Awson/p/7260363.html