【16级第一周寒假作业B题】

来源:互联网 发布:手机ai软件下载 编辑:程序博客网 时间:2024/06/12 00:29

网址链接:http://210.34.193.66:8080/vj/Contest.jsp?cid=160#P1



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

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 4125.689 125.689125.689 125.688125.688 125.689125.688 125.689125.688 125.688125.688 125.688125.688 125.688 125.688 125.688125.688 125.689 125.688 125.688125.689 125.689 125.688 125.689125.688 125.689 125.688 125.689
SampleOutput
91465
思路:
1.这是一道二分题。为什么是二分?QAQ说实在没学二分之前甚至初学之时我也看不出这是二分题,很苦恼。。不过多做几次关于二分的题便也能辨认出来,毕竟呵呵人家问题就是这么问的(下标)。需要的请看链接:http://www.cnblogs.com/qswg/p/6251887.html
2.第一眼看这道题我就联想到了结构体,但事实上用结构体很麻烦的,而且还容易出错。根据题意,我们可以根据优先级把两个数的分别比较化为一个数的比较,即把第一个数的最小分度提到第二个数的最大分度之前,把两者合并为一个数。当然,在这之前要先把这两个带三位小数的浮点数化整,这又涉及另外一个问题——精度问题。(容易坑死人的问题,反正博主这菜鸡……T^T我放图,这是博主的大佬给的,很直观!)

3.其他好像也没有什么了,注意一下二分函数返回的下标值就好了。。
/**p1,p2的输入同pi*/long long k1=1e9,k2=1e3;for(i=0; i<n; i++){    scanf("%lf%lf",&x,&y);    p[i]=(ll)(k2*x+0.0001)*k1+(ll)(k2*y+0.0001);}
当然,1e9是浮点数,也会有精度缺失,最好写成1000000000。二分的代码段我就不给了,需要的请看思路1的链接。

0 0