ACM练级日志:HDU 4288 离散化

很久没有写线段树,今天看见这道题一开始以为是个平衡树,用set想暴力冲过去,结果失败了…… 但是看discuss里面有个大神居然直接用数组模拟冲过去了,不知道他怎么做到的!


一开始没想到要用线段树,这次也算是长经验了吧,这种散点、有序、还不重复的操作,其实可以离散化以后用线段树表示的,而且这种“每隔5个求和”似乎用平衡树系的数据结构也无力,而线段树天生的求和能力在这儿就体现出来了。


程序写起来并不麻烦,一开始错在两个地方,都是离散化后数组和原数组弄错了,离散化以后,所有操作都在离散化后数组做,没有原数组什么事了。


贴一下离散化去重部分:


sort(&appear[1], &appear[p_appear+1]);//p_appear是不同的数字个数
p_appear = unique(appear+1, appear + p_appear +1) - numbers - 1;// unique函数会返回指向第一个重复元素的指针(迭代器)
......
int mirror = lower_bound(appear+1, appear + p_appear +1 , a[i]) - appear; //找到了对应的下标,注意如果后面可能出现appear数组里没有的数,还需要判断:if(appear[mirror] == a[i]) 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值