zoukankan      html  css  js  c++  java
  • 发财兔几何【二分】

    题目描述

    小明非常喜欢计算几何,有一天他突发奇想,从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;
    }
  • 相关阅读:
    OpenCV用读取矩阵,访问图像数据
    OpenCV_Add方法
    OpenCV_颜色直方图的计算、显示、处理、对比及反向投影
    sift算法研究_无匹配
    OpenCV_轮廓例子
    OpenCV_用鼠标在窗口画方形
    【转】数字图像处理中的形态学
    OpenCV_ 滑动条模拟按钮
    OpenCV_轮廓的查找、表达、绘制、特性及匹配
    图像的膨胀与腐蚀、细化
  • 原文地址:https://www.cnblogs.com/hao-tian/p/10386214.html
Copyright © 2011-2022 走看看