Description

Input 
Output

Sample Input
3
4 5 3
3 5 4
2
1 1
3 3
Sample Output
0
3
Data Constraint

Hint

正解
首先这个线段的连接方式就是最小的y连最小的x这样一直连,之后我们看对于两个线段如何判断是否香蕉呢?假设询问的点是xx,yy,另个线段的纵坐标是y,横坐标是x,我们可以按照另一个线段的斜率求出yy此时应对应的横坐标,但是由于另个线段是由左上角到右下角的,所以此刻求出来的值应减去x,然后判断是否大于xx就得知是否香蕉了。那么对于n条线段,显然可以二分(排好序)那么时间复杂度也就降下来了。
#include<cstdio>
#include<algorithm>
#define N 100007
using namespace std;
int n,x[N],y[N],m;
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+n+1);
sort(y+1,y+n+1);//拍个序
scanf("%d",&m);
for(int i=1;i<=m;i++){
int xx,yy;
scanf("%d%d",&xx,&yy);
int l=1,r=n;
while(l<=r){//二分
int mid=l+r>>1;
double dx=(double)yy/y[mid]*x[mid];//yy在y,x的斜率中对应的横坐标
dx=x[mid]-dx;//减去
if(dx<=xx) l=mid+1;
else r=mid-1;//判断
}
printf("%d\n",r);
}
}
959



被折叠的 条评论
为什么被折叠?



