3
4 5 3
3 5 4
2
1 1
3 3
0
3
想想怎样是线段之间没有交点?排序横坐标x和纵坐标y,然后[(x,0),(0,y)]一一对应相连,这样线段之间没有交点,然后可以构建截距式直线方程。带入输入的p点x‘坐标,求出对应的y点坐标,如果y<y‘那么就有交点,否则没用交点,为了快速计算有多少交点,使用二分(排序后的n条线段是逐渐远离原点的)。
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 const int N = 100009; 6 typedef long long LL; 7 LL gx[N], gy[N], x, y; 8 int n, m; 9 int main() 10 { 11 scanf("%d", &n); 12 for(int i = 1; i <= n; i++) 13 scanf("%lld", &gx[i]); 14 for(int i = 1; i <= n; i++) 15 scanf("%lld", &gy[i]); 16 sort(gx+1, gx+n+1); 17 sort(gy+1, gy+n+1); 18 scanf("%d", &m); 19 for(int i = 1; i <= m; i++) 20 { 21 scanf("%lld%lld", &x, &y); 22 int l = 1, r = n, ans = 0; 23 while(l <= r) 24 { 25 int mid = (l + r) >> 1; 26 LL tmp = gx[mid] * gy[mid] - gy[mid] * x; 27 if(tmp <= gx[mid]*y) ans = mid, l = mid + 1; 28 else r = mid - 1; 29 } 30 printf("%d\n", ans); 31 } 32 return 0; 33 }

原文:https://www.cnblogs.com/Jony-English/p/12952828.html