天津大学2010年区域赛1007 Giant For

这题典型的线段树加离散化,比赛的时候没有思路,中午突然想到了怎么实现。

这题主要的思路是将全部的数据读取进来然后离线处理,离散化的时候把不同的点按照先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排序,返回原来输入的顺序,这样保证了读取的顺序和输入顺序一致。

 

我的代码:

 

 

看来还是见世面见的太少了,很多算法没有思路。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值