• FJUT寒假第一周作业浮点数查寻题解


    二分强化——浮点数序列查询

    TimeLimit:4000MS  MemoryLimit:128MB
    64-bit integer IO format:%I64d
    Problem Description

    已知在二维空间中有n个点,p0,p1……pn-1

    已按照x为第一优先级,y为第二优先级从大到小排好序;

    即若 pi<pj

    则pi.x<pj.x,或者pi.x==pj.x&&pi.y<pj.y

    Input

    只有一组数据
    第一行是两个整数n,m分别代表点的个数和查询次数
    接下来n行,每行有二个带三位小数的浮点数x,y代表一个点的坐标
    再接下来m行,每行的有4个数字x1,y1,x2,y2代表p1,p2且p1>=p2

    其中n,m<=100000;

    任意0<=x,y<10^6;

    Output

    输出n个点所有小于等于p1且大于等于p2的点的下标之和

    SampleInput
    6 4
    125.689 125.689
    125.689 125.688
    125.688 125.689
    125.688 125.689
    125.688 125.688
    125.688 125.688
    125.688 125.688 125.688 125.688
    125.688 125.689 125.688 125.688
    125.689 125.689 125.688 125.689
    125.688 125.689 125.688 125.689
    
    SampleOutput
    9
    14
    6
    5
      首先第一思路一个一个比较,当由于数据庞大且有从大到小排列的小提示,显然是二分。之后就是构建数组写二分函数。
      构建数组有个小技巧,把第一优先级乘一个较大的数,次优先级乘较小数获得的一个数字。恰好符合题目的比较条件。之后利用二分上下界函数找数字之间个数就完成了。接下来是这题的小细节,浮点数精度缺失的问题。

    浮点数运算都会有精度缺失,转换整型也会有缺失。只是缺失比较小。当数据大的时候误差就出现了。

    这题将两个浮点数整合为整数就可能遇到这个问题。

    注意运算先后可能发生的精度缺失,然后用0.1补精度这一小技巧成功AC。(乘1000后,最小分度为1)。

    另外1e9是浮点数,也会有进度缺失,最好改1000000000.这题被我水过去

    最后附上这题我的二分函数,及调用。最后记得连续下标和是一个等差数列

    long long f(ll *arr,int len,double x)
    {
        long long r=-1,l=len,mid;
        while(r+1<l)
        {
            mid=(r+l)/2;
            if(arr[mid]>x)
            {
                r=mid;
            }
            else
            {
                l=mid;
            }
        }
        return l;
    }
    View Code
        i=f(arr,n,p1);
        j=f(arr,n,p2-1);
        sum=(i+j-1)*(j-i)/2;
    View Code

    
    
  • 相关阅读:
    【PostgreSQL-9.6.3】触发器概述(普通触发器)
    【MySQL】二进制分发安装
    【MySQL】RPM包安装
    【PostgreSQL-9.6.3】分区表
    【PL/SQL】用星号拼出金字塔
    【PostgreSQL-9.6.3】临时表
    【PL/SQL】触发器示例:记录加薪
    【PL/SQL】九九乘法口诀表
    数据结构和算法
    类元编程
  • 原文地址:https://www.cnblogs.com/Q1143316492/p/6293044.html
Copyright © 2020-2023  润新知