题意:在平面直角坐标系中给你N个点,stan和ollie玩一个游戏,首先stan在竖直方向上画一条直线,该直线必须要过其中的某个点,然后ollie在水平方向上画一条直线,该直线的要求是要经过一个stan之前画过的点。 这时候平面就被分割成了四块,两个人这时候会有一个得分,stan的得分是平面上第1、3象限内的点的个数,ollie的得分是平面上第2、4象限内的点的个数,在统计的时候在所画线上的点都不计算在内。求最终stan使得自己的最差得分最高,并且输出此时ollie的得分。
根据题目中的数据画出来的图是这样的,两边的数字分别表示的是,低于当前点y坐标的点的个数(用ol[]数组表示),高于当前点y坐标的点的个数(用st[]数组表示),分别用这两个数组建两棵线段树,表示Ollie的分数和stan的分数。处理出这样的数据后,我们把坐标以x从小到大排序,之后,每扫到一个x即是stan画下了一条竖线,这时候,Ollie画下的横线就是每个扫到的点的y坐标。
在status 1的时候,当Ollie取的横线分别是y=-4、-3、-2时,stan的分数分别是st[-4]=9,st[-3]=7和st[-2]=5,而Ollie的分数分别是ol[-4]=1,ol[-3]=2和ol[-2]=4。(即分别在线段树里单点查询这些点的值)
当扫第x=0的时候,原来属于Ollie的3个点,即(-3,-4),(-3,-3),(-3,-3)已经是属于stan,这怎么在线段树里体现里?当这时候,当Ollie选择横线的y是大于等于-3的时候,那么(-3,-4)是点是属于stan的,那么我们就可以在stan的线段树里在区间[-3,7]里加1(这就搞定了不是?),同理处理出(-3,-3),(-3,-2),而Ollie得分的处理方式是类似的,这样的处理可以在status 1里完成,所以当我们到达status 2的时候,只需要处理(0,0)这个点,之后,那么我们在两棵线段树里分别查询y=0,即得到了在status 2时stan和Ollie的分数。
#include
#include
#include
#include
#include
#include