发财兔几何【二分】
题目描述
小明非常喜欢计算几何,有一天他突发奇想,从x正半轴和y正半轴上分别选了n个点,他按照某种顺序把两边的点一一对应连起来,构成了n个线段,其中要保证任意两个线段是不相交的。
后来小明又提出了q个问题,每个问题给出一个点P(x,y),我们想要知道OP线段和多少小明连起来的那n个线段有交点。(O为原点)
后来小明又提出了q个问题,每个问题给出一个点P(x,y),我们想要知道OP线段和多少小明连起来的那n个线段有交点。(O为原点)
输入
第一行一个整数n。
第二行n个整数表示选的x坐标。
第三行n个整数表示选的y坐标。
第四行一个整数q表示询问的数量。
接下来q行每行两个整数x,y,表示一个询问。
第二行n个整数表示选的x坐标。
第三行n个整数表示选的y坐标。
第四行一个整数q表示询问的数量。
接下来q行每行两个整数x,y,表示一个询问。
输出
q行,第i行表示第i个询问的答案。
样例输入
3
4 5 3
3 5 4
2
1 1
3 3
样例输出
0
3
提示
对于 40%的数据,n,q<=10。
对于 60%的数据,n,q<=100。
对于 80%的数据,n,q<=1000。
对于 100%的数据,n,q<=100000,1<=x[i],y[i]<=(2^31)-1。
#include <bits/stdc++.h> using namespace std; const int maxn = 100005; int x[maxn]; int y[maxn]; int n; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&x[i]); for(int i=1;i<=n;i++) scanf("%d",&y[i]); sort(x+1,x+1+n); sort(y+1,y+1+n); int T; scanf("%d",&T); while(T--) { int xx,yy; scanf("%d%d",&xx,&yy); int l = 1,r = n,mid = (1+n)/2; while(l<=r) { mid = (l+r)/2; double k = (double)y[mid]/(double)x[mid]; double ty = (double)y[mid]-k*(double)xx; if(ty>yy) r = mid-1; else l = mid+1; } printf("%d\n",r); } return 0; }