发财兔几何二分

Posted hao-tian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了发财兔几何二分相关的知识,希望对你有一定的参考价值。

题目描述

小明非常喜欢计算几何,有一天他突发奇想,从x正半轴和y正半轴上分别选了n个点,他按照某种顺序把两边的点一一对应连起来,构成了n个线段,其中要保证任意两个线段是不相交的。

后来小明又提出了q个问题,每个问题给出一个点P(x,y),我们想要知道OP线段和多少小明连起来的那n个线段有交点。(O为原点)
 

 

输入

第一行一个整数n。
第二行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
",r);
    }
    return 0;
}

 












以上是关于发财兔几何二分的主要内容,如果未能解决你的问题,请参考以下文章

Gym 101464C - 计算几何+二分(uva1463)

景驰无人驾驶 1024 编程邀请赛 B题 计算几何+裸二分匹配

BNU校赛总决赛J 小白兔小灰兔 相交计算几何模板

Hrbustoj 1429 二分+计算几何

如果几何着色器处于活动状态,如何将信息从顶点着色器传递到片段着色器?

contest 1.13