BZOJ 1071 毒瘤题,单调指针搞搞

题目还是看原题吧。
这道题简直魔性、先膜一下大佬wjj(ORZ)

我们令s=A* h+B* v。
原式就是s <= A* minh + B * minv + C

我们预处理出所有S。我们把数据复制两份,x数组按s从小到大排序,y数组按h从小到大排序。

我们随便枚举minv,我们在算出一个maxv=minv+C/B(有什么用一会解释),然后在内层我们再在y数组中从小到大枚举minh,这样我们就发现在内层中原式右边的一坨是单调递增的,这样我们就有了单调性,看似可以搞搞了。然后我们用一个r指针指向x数组首,一个l指针指向y数组首。因为单调我们一直让r指针增加直到不满足等式,我们把所有v大于等于minv的并且小于等于maxv(为什么一会解释)的让cnt++,但是这样会有一个问题,因为可能把h小于minh的算进去,所以我们在y数组上把那些小于minh的被多计算了的减去。

那么问题来了maxv有什么用呢?

我们把原式再看一遍:A * h + B * v < = A * minh + B * minv + C
我们把所有带h的都去掉:B * v < = B * minv + C
两边除以B : v <= minv+C/B 这便是maxv的由来。
它有什么意义呢?如果一个球员 v 小于等于maxv并且h <= minh那么它必然会满足上面那个等式(虽然这是不合法的,但我们在第一次计算中会把它也算进去)
其次如果 v > maxv 那么必然h < minh 这意味这什么如果v > maxv那么它必然非法。

所以maxv有一个作用便是在减去非法情况的时候,都是那些一定会被计算且非法的情况。

我们在仔细想想:如果一个球员的V很大,但h很小会有什么效果,
那就是它的s会很大,但h会很小,也就是说他会在比较后面被枚举,maxv另一个作用就是防止这种情况,让l指针扫到后面去,前面却照顾不到。(可以想一下没有maxv会怎样与前面那个作用连起来想一想)

你可能感兴趣的:(题解)