这题典型的线段树加离散化,比赛的时候没有思路,中午突然想到了怎么实现。
这题主要的思路是将全部的数据读取进来然后离线处理,离散化的时候把不同的点按照先x后y的方式离散化,也就是说只要两个点不是同一个点,那么他们的离散化后的hash值就不一样,将离散化后的值放到lst数组中去。
在线段树中维护第i个lst元素是否存在,如果存在,那么线段树中的第i个元素值就是lst[i]对应的y值,否则就为-1,seg的值记录[l,r]区间的最大值。每次find的时候,读取的如果是x,y,那么去找[x+1,M]区间,优先找左边的区间,如果左边区间的最大值比y来的大,那么解一定在左边区间,如果左边区间的最大值小于或等于y,那么用同样的方法找右区间,如果依然没有比y大的,那么返回-1,否则返回第一个比y大的区间在lst数组中对应的脚标。
主要是离散化的方式有点特别,先按xy排序,记录lst数组,然后按id排序,返回原来输入的顺序,这样保证了读取的顺序和输入顺序一致。
我的代码:
看来还是见世面见的太少了,很多算法没有思路。